在 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
我是 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 |