日期范围:包含与严格边界

时间:2010-09-30 20:14:33

标签: sql ruby-on-rails model-view-controller datetime user-interface

当允许用户选择日期范围时,让我们说:

  

显示从[ 8月1日]到[ 9月1日]

的条目

作为一个用户,我通常希望这包括9月1日的结果。特别是当你考虑到我为两端选择相同的日期时,我显然是指“从一天开始到一天结束”:< / p>

  

显示从[ 9月1日]到[ 9月1日]的参赛作品

作为程序员,我认为日期边界为“零小时”,即“开始日”;从逻辑上讲,9月1日的条目实际上是在“2010-09-01 00:00:00”之后(因此超出了范围)。

例如,在SQL中,以下条件将排除所有内容:

SELECT * FROM entries
WHERE created_at >= DATE('2010-09-01') AND created_at <= DATE('2010-09-01')

显然,需要从用户输入到SQL进行调整,以便将结束日期提前24小时。

但是,这仅适用于 timestamp datetime 列。当列是日期时,则直接比较有效并且不应添加此调整。

在诸如Rails之类的MVC框架中,在发送查询之前,您在哪里处理此输入不匹配的逻辑?如果它在控制器中,似乎过分依赖于了解模型的内部字段(日期与日期时间),如果它在模型中,“find_in_date_range”方法是否会被理解为包含,或者只是邀请日常错误?

最后,我的假设是否正确使用户界面代表包容范围?这种情况总是如此,或者是否存在严格(独占)日期边界更合适的情况?例如,在我的rake脚本中,我使用参数END_DATE=2010-09-01来捕获最多这个日期,这与UI不一致,但对我来说很有意义:你在哪里绘制这条线?

1 个答案:

答案 0 :(得分:7)

我的个人偏见:

编程然而你认为用户会喜欢它,但总是在带有标签的GUI中明确包容性和排他性选择。而不是说

Between _____________ and ______________

我总是标记为

On or after _______________ but before _______________

On or after ______________ through ______________

(如果您正在编写一些用户每天使用的软件,并且您可以仔细训练它们,那么他们无论如何都不会阅读GUI标签,所以不要打扰。)