允许用户选择日期范围时,说:
请显示[8月1日]至[9月1日]的条目
作为用户,我通常希望它包含9月1日的结果。尤其是当您考虑到当我为两端选择相同的日期时,我的意思显然是“从一天的开始到一天的结束”:
向我显示[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小时。
但是,这仅适用于时间戳或日期时间列。如果该列是日期,则可以进行直接比较,并且不应添加此调整。
在诸如Rails的MVC框架中,在发送查询之前,应在哪里处理此输入不匹配的逻辑?如果在控制器中,则似乎过多地依赖于了解模型的内部字段(日期与日期时间),并且如果在模型中,则将“ find_in_date_range”方法理解为包含性的,还是只是邀请了日常错误?
最后,我的假设对于让用户界面代表包含范围是正确的吗?总是这样吗?还是存在一些严格的(排他性的)日期边界更合适的情况?例如,在我的rake脚本中,我使用参数
END_DATE=2010-09-01
捕获截至该日期,这与UI不一致,但是对我来说很有意义:您在哪里画这条线? 最佳答案
我的个人偏见:
对其进行编程,但是您认为用户会喜欢它,但是始终在带有标签的GUI中明确显示包含或不包含选择。而不是说
Between _____________ and ______________
我总是标为
On or after _______________ but before _______________
要么
On or after ______________ through ______________
(如果您正在编写一些用户每天都在使用的软件,并且您可以仔细地培训他们,那么他们无论如何都不会阅读GUI标签,因此不必理会。)