【发布时间】:2018-07-25 14:58:50
【问题描述】:
我发现有一个函数 last_day 用于月份的最后一天,date_part(dow, date) 用于从星期日开始的数字星期几,但我正在尝试约会,并获得该周的第一天。
含义:如果 date='2018-02-14' 那么结果应该是 '2018-02-11'。
有什么想法吗?
【问题讨论】:
标签: sql amazon-redshift
我发现有一个函数 last_day 用于月份的最后一天,date_part(dow, date) 用于从星期日开始的数字星期几,但我正在尝试约会,并获得该周的第一天。
含义:如果 date='2018-02-14' 那么结果应该是 '2018-02-11'。
有什么想法吗?
【问题讨论】:
标签: sql amazon-redshift
您只想从当前日期中减去 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)
【讨论】:
start_of_week 函数。有一个week 日期部分,所以你可以使用datepart(wk, my_date),但我认为这对你没有用。
dateadd(d, 1, date_trunc(week, dateadd(d -1, dt)))
不确定是否有更有效的解决方案,但是:
date_trunc('week',my_date + '1 day'::interval)::date - '1 day'::interval as week_start
【讨论】:
如果你想得到一周的第一天,一周的开始日是一周中的任何一天(星期一,星期二,...)。你可以这样使用:
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,以确定一周的开始日期(星期一、星期二、...、星期日)。
【讨论】: