【问题标题】:First day of week (beginning with Sunday)一周的第一天(从星期日开始)
【发布时间】:2018-07-25 14:58:50
【问题描述】:

我发现有一个函数 last_day 用于月份的最后一天,date_part(dow, date) 用于从星期日开始的数字星期几,但我正在尝试约会,并获得该周的第一天。

含义:如果 date='2018-02-14' 那么结果应该是 '2018-02-11'。

有什么想法吗?

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    您只想从当前日期中减去 dow 值。

    select dateadd(d, -datepart(dow, my_date), my_date)  
    from (select date('2018-02-14') as my_date)
    
    > 2018-02-11 00:00:00.0
    

    例如,如果 dow 是 3 代表 2018-02-14 - 星期三 - 您可以减去 3 天以返回“第 0 天”。


    还有date_trunc 函数,它会在给定的日期部分之后截断所有内容。这有点笨拙,只会让您回到之前的星期一,而不是星期日

    select date_trunc('week', my_date)
    from (select date('2018-02-14') as my_date)
    

    【讨论】:

    • 感谢 Kirk- 所以您确认不存在公式对吗?
    • 我不知道start_of_week 函数。有一个week 日期部分,所以你可以使用datepart(wk, my_date),但我认为这对你没有用。
    • @user8834780 为您找到了另一个可能有帮助的功能。
    • dateadd(d, 1, date_trunc(week, dateadd(d -1, dt)))
    【解决方案2】:

    不确定是否有更有效的解决方案,但是:

    date_trunc('week',my_date + '1 day'::interval)::date - '1 day'::interval as week_start
    

    【讨论】:

    • 这也对我有用!谢谢!
    【解决方案3】:

    如果你想得到一周的第一天,一周的开始日是一周中的任何一天(星期一,星期二,...)。你可以这样使用:

    day_of_week_index映射:

    {
        'monday': 1,
        'tuesday': 2,
        'wednesday': 3,
        'thursday': 4,
        'friday': 5,
        'saturday': 6,
        'sunday': 7
    }
    

    查询模板:

    SELECT 
    CASE
        WHEN extract(ISODOW FROM datetime_column) < day_of_week_index THEN cast(date_trunc('week', datetime_column) AS date) - 8 + day_of_week_index
        ELSE cast(date_trunc('week', datetime_column) AS date) - 1 + day_of_week_index
    END
    FROM table_name;
    

    示例:

    获取一周的第一天,一周的开始日是星期三

    SELECT
    CASE
        WHEN extract(ISODOW FROM TIMESTAMP '2021-12-03 03:00:00') < 3 THEN cast(date_trunc('week', TIMESTAMP '2021-12-03 03:00:00') AS date) - 8 + 3
        ELSE cast(date_trunc('week', TIMESTAMP '2021-12-03 03:00:00') AS date) - 1 + 3
    END;
    

    => 结果:

    2021-12-01
    

    注意:您可以根据上述映射更改day_of_week_index,以确定一周的开始日期(星期一、星期二、...、星期日)。

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2018-02-09
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多