algorithm – 在数据库中,如何存储事件发生日期和时间帧以进行快
假设我正在维护一个事件数据库,可以是每周一次的营业时间表(周一至周五:上午10点至下午7点,周六:下午12点至下午6点,周日:休息),以及月度活动(艺博会,每个第一个星期六,从上午10点到下午5点)到年度活动(平安夜慈善晚宴,晚上7点至晚上9点)
在理想的情况下,我想在任何一天查询数据库,比如说: …并查找正在发生的所有事件: >定期周四中午(例如开业) 我想在没有首先考虑如何将这样的日期/时间存储在数据库中的情况下讨论查询构造是没有意义的. 我无法想象定期每周工作时间(甚至忽略边缘情况)的概念如何能够在一个单一记录的单一领域中建模,该领域也将模拟每年一次的事件.至少,似乎我需要至少五个字段: >开始时间 而且我猜测没有办法将它封装在一行中,对吧?例如,每个工作日开放的企业将有五个记录. 并且最终目标是能够执行相对优雅的查询,该查询可以找到在其时间范围内包含给定时刻的所有事件记录. 解决方法不确定你是否专门要求dbms-agnostic解决方案,无论如何在 postgresql中(我认为在大多数RDBMS中都可以)你可以存储时间戳并从中获取大量信息: http://www.postgresql.org/docs/8.4/interactive/functions-datetime.html.Postgresql特定的答案
例如,要选择每个第二个星期四发生的事件,您可以写: 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提供的数据类型和函数,并且只有在您无法真正找到解决方案时才尝试自己建模. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |