在 Snowflake 查询中是否有等效的方法来编写 DATEDIFF(Week,1,[Date]) ?

Is there an equivalent way to write DATEDIFF(Week,1,[Date]) in a Snowflake query?

我是 Snowflake 的新手,正在尝试将现有的基于 SQL 的查询转换为 Snowflake 语法。找到一些东西不容易翻译。其中之一是 SQL DATEADD 函数的周参数。

如何以 Snowflake 查询的形式编写 DATEDIFF(Week,1,[Date])?可能吗?


这个问题问错了。对于 WEEK 参数

应该是 DATEDIFF NOT DATEADD

对于错误信息,我深表歉意。我应该更改(编辑)标题还是删除 re-post 正确的问题?

这就是我要解决的问题。

SELECT DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),-3) 在 SQL

中执行

同一查询在 Snowflake 中产生此错误 SQL 编译错误:位置 21 处的错误行 1 函数 'DATE_DIFFTIMESTAMPINWEEKS' 的参数类型无效:(NUMBER(1,0), TIMESTAMP_LTZ(9))

类似地,我想一个更简化的例子是:

SELECT DATEDIFF(WEEK,1,GETDATE())

格式为:

DATEADD(Week,1,[Date])

其中 1 表示您要添加多少周

编辑: 根据编辑后的问题,请参阅下面的更新答案

我不熟悉这种语法

SELECT DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),-3)

但根据我的阅读和一些 SQL Fiddle,它似乎输出“本周”的开始减去 3 天

Snowflake 中的等价物将是:

DATEADD(DAY,-3,DATE_TRUNC(WEEK,GETDATE()))

但是,从字面上看,Snowflake 会从“本周”开始输出负 3 周

DATEADD(WEEK, -3, DATE_TRUNC(WEEK,GETDATE()))

Snowflake 支持INTERVAL算法:

You can use interval constants to add or subtract a period of time to/from a date, time, or timestamp. Interval constants are implemented using the INTERVAL keyword, which has the following syntax:

{ + | - } INTERVAL ' [ <date_time_part> ] [ , [ <date_time_part> ] ... ]'

SELECT "Date" + INTERVAL '1 WEEK'
FROM tab

您可以使用以下格式

select dateadd(WEEK, 1, to_date('2000-01-31')) as different_day; 
select dateadd(WEEK, 1, '2000-01-31'::date) as different_day;

使用方法请参考以下文档link

https://docs.snowflake.com/en/sql-reference/functions/dateadd.html#examples

这个 T-SQL 代码正在截断到周粒度,然后是 3 天前。

SELECT DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),-3)

T-SQL

SELECT d, 
    DATEADD(WEEK, DATEDIFF(WEEK,0,d),-3)
FROM (VALUES
('2022-05-19'), 
('2022-05-14'), 
('2022-05-22')
) as t(d)

给出:

d trunc
2022-05-19 2022-05-13 00:00:00.000
2022-05-14 2022-05-06 00:00:00.000
2022-05-22 2022-05-20 00:00:00.000

所以你实际上想要什么DATE_TRUNC

雪花:

SELECT d, 
    dateadd(day, -3, date_trunc(week, d))
FROM VALUES
('2022-05-19'::date), 
('2022-05-14'::date), 
('2022-05-22'::date) t(d)
;

但是对于我的例子来说:

D DATEADD(DAY, -3, DATE_TRUNC(WEEK, D))
2022-05-19 2022-05-13
2022-05-14 2022-05-06
2022-05-22 2022-05-13

使用 WEEK_START 会话参数,我们可以设置 7(星期日),它将与我当前的 SQL Server 2019..

实例相同
ALTER SESSION SET WEEK_START = 7;

SELECT d, 
    date_trunc(week, d) as a,
    dateadd(day, -3, a) as b
FROM VALUES
('2022-05-19'::date), 
('2022-05-14'::date), 
('2022-05-22'::date) t(d)
;
D A B
2022-05-19 2022-05-15 2022-05-12
2022-05-14 2022-05-08 2022-05-05
2022-05-22 2022-05-22 2022-05-19

眼尖的人会注意到这些日期不匹配,我非常困惑,在 SQL 服务器中,5 月 22 日似乎被“截断”到 23 日......这超出了我的范围......

T_SQL:

SELECT d, 

    DATEADD(WEEK, DATEDIFF(WEEK,0,d),0),
    DATEADD(WEEK, DATEDIFF(WEEK,0,d),-3)
FROM (VALUES
('2022-05-19'), 
('2022-05-14'), 
('2022-05-22')
) as t(d)
input trunc offset
2022-05-19 2022-05-16 00:00:00.000 2022-05-13 00:00:00.000
2022-05-14 2022-05-09 00:00:00.000 2022-05-06 00:00:00.000
2022-05-22 2022-05-23 00:00:00.000 2022-05-20 00:00:00.000