【问题标题】:Calculate number of specific days between dates in Snowflake计算雪花中日期之间的特定天数
【发布时间】:2021-12-03 02:55:41
【问题描述】:

我正在寻找一些指导,以查找比方说星期一和星期三在两个日期 Date1 和 Date2 之间(包括 Snowflake 中的两个日期)的出现次数。有什么建议吗?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    标准做法是构建日历表:作为永久表或内联视图。

    CREATE TABLE calendar
    AS
    SELECT DATEADD(day, ROW_NUMBER() OVER(ORDER BY seq8()), '1999-12-31'::DATE) AS d,
          DAYOFWEEK(d) AS day_of_week,
          DAYNAME(d) AS day_name
          -- month/quarter/year/...
    FROM TABLE(GENERATOR(ROWCOUNT => 365*100));
    

    然后:

    SELECT c.day_name, COUNT(*) AS cnt
    FROM calendar c
    WHERE c.d BETWEEN '<date_1>' AND '<date_2>'
      AND c.day_of_week IN (1,3)
    GROUP BY c.day_name;
    

    注意:星期几取决于参数WEEK_START。

    【讨论】:

    • 感谢 Lukasz 的解决方案,我试过了,但似乎 table 语句有错误,row_number 应该是 dateadd 函数的第二个参数。交换后我能够使查询工作。
    • @Jimpats 是的,感谢您发现它。固定
    【解决方案2】:

    Lukasz 的表格解决方案相当简洁,但我会尝试 JS 版本:

    // not sure the best name to have here
    create or replace function num_of_days_in_between(
      day_nums varchar(255), 
      start_date varchar(10), 
      end_date varchar(10)
    ) 
    RETURNS string
    LANGUAGE JAVASCRIPT 
    AS $$
      // perform some validations first on parameters
      
      var s = new Date(START_DATE);
      var e = new Date(END_DATE);
    
      var split = DAY_NUMS.split(",");
    
      var count = 0;
      var d = s;
    
      // go through each day and check if the 
      // current day is in the days asked
      while (d.getTime() <= e.getTime()) {
        // split array contains strings, so we need to
        // force getDay() value to be string as well,
        // otherwise includes() will not find it
        if(split.includes(d.getDay()+"")) {
          count++;
        }
    
        // advance to the next day
        d = new Date(d.getTime() + 86400000);
      }
    
      return count;
    $$;
    
    -- Monday and Wednesday
    select num_of_days_in_between('1,3', '2021-10-01', '2021-11-01'); -- 9
    -- Tuesday
    select num_of_days_in_between('2', '2021-10-01', '2021-11-01'); -- 4
    

    请注意,在 JS 中,日期从星期日开始,索引为 0,请参阅Date.getDay()。

    【讨论】:

    • 谢谢 Eric,我也会试试这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多