Postgresql根据日历日查询数周的数据,无论哪一个

时间:2017-06-06 01:18:10

标签: sql postgresql date

在PostgreSQL中,如何使用一天的日期作为输入来获取一周内所有日期的日期?例如,假设用户在日历用户界面小部件中点击了一天。这突出了整个星期。

我想编写一个查询,从日历列中匹配突出显示周中任何一天的日期的表中的所有行,无论用户是选择星期一,星期三等等。

2 个答案:

答案 0 :(得分:3)

您应该结合一周年,以使查询在一年结束时开始稳定。例如:

select *
from some_table
where to_char(some_date_column, 'iyyy-iw') = to_char(date '2017-06-06', 'iyyy-iw')

iyyyiwISO 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()函数

没有相应的“非iso”关键字

答案 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"

http://rextester.com/KZX2905