algorithm – 在数据库中,如何存储事件发生日期和时间帧以进行快速/优雅查询?

前端之家收集整理的这篇文章主要介绍了algorithm – 在数据库中,如何存储事件发生日期和时间帧以进行快速/优雅查询?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我正在维护一个事件数据库,可以是每周一次的营业时间表(周一至周五:上午10点至下午7点,周六:下午12点至下午6点,周日:休息),以及月度活动(艺博会,每个第一个星期六,从上午10点到下午5点)到年度活动(平安夜慈善晚宴,晚上7点至晚上9点)

在理想的情况下,我想在任何一天查询数据库,比如说:
2012年1月12日,星期四,中午12点

…并查找正在发生的所有事件:

>定期周四中午(例如开业)
>每隔一个星期四(一个艺术博览会)
> 1月12日,特别是(呃……土库曼斯坦阵亡将士纪念日)

我想在没有首先考虑如何将这样的日期/时间存储在数据库中的情况下讨论查询构造是没有意义的.

我无法想象定期每周工作时间(甚至忽略边缘情况)的概念如何能够在一个单一记录的单一领域中建模,该领域也将模拟每年一次的事件.至少,似乎我需要至少五个字段:

>开始时间
>持续时间
>星期几(例如星期一,星期二等)
>可选的绝对年度日期(例如5月8日)
>可选每月发生(第四个星期三)

而且我猜测没有办法将它封装在一行中,对吧?例如,每个工作日开放的企业将有五个记录.

并且最终目标是能够执行相对优雅的查询,该查询可以找到在其时间范围内包含给定时刻的所有事件记录.

解决方法

不确定你是否专门要求dbms-agnostic解决方案,无论如何在 postgresql中(我认为在大多数RDBMS中都可以)你可以存储时间戳并从中获取大量信息: http://www.postgresql.org/docs/8.4/interactive/functions-datetime.html.

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个时间戳字段,用于事件的开始/结束.

另请注意,您可以添加或减去时间戳,以及知道间隔是否重叠.

一般来说,我会首先尝试使用DBMS提供的数据类型和函数,并且只有在您无法真正找到解决方案时才尝试自己建模.

原文链接:https://www.f2er.com/mssql/76913.html

猜你在找的MsSQL相关文章