在理想的情况下,我想在任何一天查询数据库,比如说:
2012年1月12日,星期四,中午12点
…并查找正在发生的所有事件:
>定期周四中午(例如开业)
>每隔一个星期四(一个艺术博览会)
> 1月12日,特别是(呃……土库曼斯坦阵亡将士纪念日)
我想在没有首先考虑如何将这样的日期/时间存储在数据库中的情况下讨论查询构造是没有意义的.
我无法想象定期每周工作时间(甚至忽略边缘情况)的概念如何能够在一个单一记录的单一领域中建模,该领域也将模拟每年一次的事件.至少,似乎我需要至少五个字段:
>开始时间
>持续时间
>星期几(例如星期一,星期二等)
>可选的绝对年度日期(例如5月8日)
>可选每月发生(第四个星期三)
而且我猜测没有办法将它封装在一行中,对吧?例如,每个工作日开放的企业将有五个记录.
解决方法
Postgresql特定的答案
9.9.1. EXTRACT,date_part
EXTRACT(field FROM source) The extract function retrieves subfields
such as year or hour from date/time values. source must be a value
expression of type timestamp,time,or interval. (Expressions of type
date are cast to timestamp and can therefore be used as well.) field
is an identifier or string that selects what field to extract from the
source value. The extract function returns values of type double
precision. The following are valid field names: […] day,DOW (day of week),DOY (day of year),[…]
例如,要选择每个第二个星期四发生的事件,您可以写:
SELECT * FROM events #your table WHERE EXTRACT(DOW FROM date_column)=4 # DOW goes from sunday (0) to saturday (6) AND EXTRACT(DAY FROM date_column)>7 # must occurr after 7th day of the month (ie. if the 1st is a Thursday AND EXTRACT(DAY FROM date_column)<15 # and before the 15th (ie. if the 1st is a Friday,so the first Thursday is on the 7th,and the second is on the 14th)
要建模持续时间,您可能只有2个时间戳字段,用于事件的开始/结束.
另请注意,您可以添加或减去时间戳,以及知道间隔是否重叠.