Zan*_*ndo 7 language-agnostic algorithm datetime database-design
假设我正在维护一个事件数据库,可以是每周一次的营业时间表(周一至周五:上午10点至下午7点,周六:下午12点至下午6点,周日:休息),以及月度活动(艺博会,每个第一个星期六,从上午10点到下午5点)到年度活动(平安夜慈善晚宴,晚上7点至晚上9点)
在理想的情况下,我想在任何给定的日子查询数据库,例如: 2012年1月12日星期四,下午12点
...并查找正在发生的所有事件:
我想在没有首先考虑如何将这样的日期/时间存储在数据库中的情况下谈论查询构造是没有意义的.
我无法想象定期每周工作时间(甚至忽略边缘情况)的概念如何能够在一个单一记录的单一领域中建模,该领域也将模拟每年一次的事件.至少,似乎我需要至少五个字段:
而且我猜测没有办法将它封装在一行中,对吧?例如,每个工作日开放的企业将有五个记录.
最终目标是能够执行相对优雅的查询,该查询可以找到包含其时间范围内给定时刻的所有事件记录.
不确定您是否专门要求与 dbms 无关的解决方案,无论如何在 postgresql 中(我认为在大多数 RDBMS 中都是可能的)您可以存储时间戳并从中获取大量信息:http: //www.postgresql.org /docs/8.4/interactive/functions-datetime.html。
Postgresql 特定答案
9.9.1. 摘录,日期部分
EXTRACT(field FROM source) extract 函数从日期/时间值中检索子字段,例如年或小时。source 必须是时间戳、时间或间隔类型的值表达式。(日期类型的表达式被转换为时间戳,因此也可以使用。) field 是一个标识符或字符串,用于选择从源值中提取哪个字段。extract 函数返回双精度类型的值。以下是有效的字段名称:[...]日、DOW(星期几)、DOY(一年中的日)、[...]
例如,要选择每个第二个星期四发生的事件,您可以编写:
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)
Run Code Online (Sandbox Code Playgroud)
为了对持续时间进行建模,您可能只需有 2 个时间戳字段,用于事件的开始/结束。
另请注意,您可以添加或减去时间戳,以及了解间隔是否重叠。
一般来说,我会首先尝试使用 DBMS 提供的数据类型和函数,只有当您无法真正找到解决方案时才尝试自己建模。
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |