我需要將日期四舍五入到最近的月份開始。例如,我希望 2022-08-30 和 2022-09-03 都評估為 2022-09-01。
如何使用 Snowflake SQL 做到這一點?
uj5u.com熱心網友回復:
我們可以將此邏輯封裝到 SQL UDF 中:
create or replace function round_to_month(d date)
returns date
as $$
select x
from (
select date_trunc(month, d) before
, dateadd(month, 1, before) after
, iff(d-before < after-d, before, after) x
)
$$
樣本:
with data(d) as (
select $1::date
from values('2020-01-10'), ('2020-01-20'), ('2020-01-16'), ('2020-01-17')
)
select *, round_to_month(d)
from data
uj5u.com熱心網友回復:
方法 1:如果日期大于中點,則在月初添加 1 個月:
WITH cte(d) AS (
SELECT s.d::DATE
FROM VALUES('2020-01-10'), ('2020-01-20'), ('2020-01-16'),
('2020-01-17'), ('2022-02-14') AS s(d)
)
SELECT d
,DATEADD('MONTH'
,(DAY(d) > CEIL(DAY(LAST_DAY(d)))/2)::INT
,DATE_TRUNC('MONTH', d)
) AS round_to_month
FROM cte;
輸出:
| D | ROUND_TO_MONTH |
|---|---|
| 2020-01-10 | 2020-01-01 |
| 2020-01-20 | 2020-02-01 |
| 2020-01-16 | 2020-02-01 |
| 2020-01-17 | 2020-02-01 |
| 2022-02-14 | 2022-02-01 |
方法二:
Snowflake 提供TIME_SLICE函式,這是獲取當前/下個月開始的最簡單方法:
SELECT '2022-10-13'::DATE AS d
,TIME_SLICE(d, 1, 'MONTH', 'START') AS prev
,TIME_SLICE(d, 1, 'MONTH', 'END') AS next
輸出:
| D | 上一篇 | 下一個 |
|---|---|---|
| 2022-10-13 | 2022-10-01 | 2022-11-01 |
使用與菲利普的答案相同的想法:
WITH cte(d) AS (
SELECT s.d::DATE
FROM VALUES('2020-01-10'), ('2020-01-20'), ('2020-01-16'),
('2020-01-17'), ('2022-02-14') AS s(d)
)
SELECT d,
CASE WHEN d-TIME_SLICE(d, 1, 'MONTH', 'START') < TIME_SLICE(d, 1, 'MONTH', 'END')-d
THEN TIME_SLICE(d, 1, 'MONTH', 'START')
ELSE TIME_SLICE(d, 1, 'MONTH', 'END')
END AS rount_to_month
FROM cte;
uj5u.com熱心網友回復:
使用 Lukasz 的樣本資料的另一種選擇——我們可以在last_day減去 15 天后將 1 天添加到每月的 1 天。如果超過/低于 15 日,減法可以讓它切換月份。我們添加 1 天以使其轉到最近的月初
select d,
last_day(d-15) 1, --shorter version using simple date arithmetic
dateadd(day, 1, last_day(dateadd(day,-15,d))) --longer and recommended version using dateadd function
from cte;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514668.html
標籤:sql日期雪花云数据平台
上一篇:在范圍內求和,直到值改變
