在PostgreSQL中,如何使用一天的日期作为输入来获取一周内所有日期的日期?例如,假设用户在日历用户界面小部件中点击了一天。这突出了整个星期。
我想编写一个查询,从日历列中匹配突出显示周中任何一天的日期的表中的所有行,无论用户是选择星期一,星期三等等。
答案 0 :(得分:3)
您应该结合一周和年,以使查询在一年结束时开始稳定。例如:
select *
from some_table
where to_char(some_date_column, 'iyyy-iw') = to_char(date '2017-06-06', 'iyyy-iw')
iyyy
和iw
是ISO week numbering。 ISO周总是从星期一开始。
或使用extract
功能:
select *
from some_table
where (extract(isoyear from some_date_column), extract(week from some_date_column))
= (extract(isoyear from date '2017-06-06'), extract(week from date '2017-06-06'))
请注意,extract(week ...)
始终是ISO周。 extract()
函数
答案 1 :(得分:1)
您最好的选择是date_trunc('week', ts)
,就像在
WHERE date_trunc('week', ts_col) = date_trunc('week', ?)
但是,这不会使用ts_col
上的索引。如果date_trunc('week', ts_col)
为ts_col
,则timestamp [without time zone]
仅可编入索引。 timestamptz
(或timestamp with time zone
)无法使用基于date_trunc()
的表达式索引。但您可以使用以下内容sargable创建
WHERE ts_col BETWEEN date_trunc('week', ?) AND date_trunc('week', ?) + interval '1 week'
请注意date_trunc('week', ...)
使用一周的ISO概念,即所有星期一周开始。如果这对您来说不够好,您可以调整以下表达式:date_trunc('day', ts) - interval '1 day' * extract(dow from ts)
。这将计算f.ex.星期日星期开始的一周开始。如果你的目标不是星期日,只需在上面的表达式上使用一些数学,例如:
select date_trunc('day', ts) - interval '1 day' * extract(dow from ts) "sunday",
date_trunc('week', ts) "monday",
date_trunc('day', ts) - interval '1 day' * ((extract(dow from ts) + 5)::int % 7) "tuesday",
date_trunc('day', ts) - interval '1 day' * ((extract(dow from ts) + 4)::int % 7) "wednesday"