雪花:计算日历天数

Posted

技术标签:

【中文标题】雪花:计算日历天数【英文标题】:Snowflake : Calculate number of calendar days 【发布时间】:2021-04-28 18:15:49 【问题描述】:

我有 2 个日期字段,想写一个条件 如果 date2 字段距离 date1 字段 >45 个日历日,则希望查看结果

我尝试了dateadd 并提取但没有得到我想要的结果。你能帮帮我吗?

Date1           Date2                                                                      
2020-01-02      2020-04-01
2020-02-01      2020-03-09
2021-01-04      2021-04-09

想看看 Date2 是否距离 date1 >45 个日历日

【问题讨论】:

请提供样本数据和所需的输出 【参考方案1】:
SELECT date1,
    date2,
    datediff('days', date1, date2) as diff,
    abs(diff)>45 as filter
FROM (VALUES                                                                    
      ('2020-01-02'::date, '2020-04-01'::date),
      ('2020-02-01'::date, '2020-03-09'::date),
      ('2021-01-04'::date, '2021-04-09'::date)
      v(date1, date2)
 )
 --WHERE filter
 ;

给予:

DATE1       DATE2       DIFF    FILTER
2020-01-02  2020-04-01  90      TRUE
2020-02-01  2020-03-09  37      FALSE
2021-01-04  2021-04-09  95      TRUE

因此,如果您在过滤器中使用此逻辑,您会期望只得到两行,这就是发生的情况。

SELECT date1,
    date2
FROM (VALUES                                                                    
      ('2020-01-02'::date, '2020-04-01'::date),
      ('2020-02-01'::date, '2020-03-09'::date),
      ('2021-01-04'::date, '2021-04-09'::date)
      v(date1, date2)
 )
 WHERE abs(datediff('days', date1, date2)) > 45
 ;

给予:

DATE1       DATE2
2020-01-02  2020-04-01
2021-01-04  2021-04-09

现在我使用了 ABS,因为差异可能在以太方向,如果你只想要 date1 之后 date2 大于 45 的行,那么可以删除 ABS。

【讨论】:

谢谢。这是有效的。我为我的逻辑删除了 ABS。 @deeps 不客气,记得点击答案旁边的勾号来解决你的问题。【参考方案2】:

你可以使用:

WHERE date1 + INTERVAL '45 day' < date2;

非 SARGable 版本:

WHERE DATEDIFF(day, date1, date2) > 45;

db<>fiddle demo

【讨论】:

这不是重新调整超过 45 个日历日的记录 @deeps 我添加了一个例子

以上是关于雪花:计算日历天数的主要内容,如果未能解决你的问题,请参考以下文章

将 Avro 中存储为整数(自 1970 年 1 月 1 日以来的天数)的“日期”转换为雪花“日期”类型

雪花分区与手动集群

雪花中的哪些操作不消耗计算积分?

在雪花的临时表中计算大小写

如何计算雪花中的日期差异?

雪花 - 计算逗号分隔列表中的不同值