我的查询看起来像这样:
select *
from mytable
where date_field between to_date(#from#, 'YYYY/MM/DD HH24:MI')
and to_date(#to#, 'YYYY/MM/DD HH24:MI')
举个例子:
if from = 2012/07/18 00:00 and
to = 2012/07/18 00:09
这是否包括时间戳2012/07/18 00:09:01
到 2012/07/18 00:09:59
的记录?
或者我应该将语句更改为:
select *
from mytable
where date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI')
< to_date(#to#, 'YYYY/MM/DD HH24:MI')
这里替换从:2012/07/18 00:00 & 到:2012/07/18 00:10应该给我所有记录的时间戳在午夜和9M59S之间超过午夜,这就是我想要的。
between 子句接受两个区间边界。我向你推荐第二种选择
select *
from mytable
where date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI')
< to_date(#to#, 'YYYY/MM/DD HH24:MI')
您可能会发现这篇文章很有趣。
日期转换会将值转换为包含所有日期元素的日期。 您尚未在字符串中指定秒,因此这些秒将变为 0。
换句话说,不包括范围":01"-":59"。
由于您正在使用字符串,并且字符串具有以正确的顺序进行比较的日期元素,因此为什么不进行字符串比较:
where to_char(datefield, 'YYYY/MM/DD HH24:MI') between #from# and #to#
我认为这完全符合您的要求,而无需摆弄日期算术。
您还可以根据建议更改语句,方法是递增#to#列并使用"<"而不是介于两者之间。
你可以做这样的事情:
SELECT *
FROM mytable
WHERE date_field between to_date(#from#, 'YYYY/MM/DD HH24:MI')
AND to_date(#to#||':59', 'YYYY/MM/DD HH24:MI:SS')
忽略DATE
元素的日期部分,因为 00:09:01 和 00:09:59 都位于"结束"时间 00:09:00 之后,不,此查询将不包括这些记录。
如果要包含这些记录,则需要将"到"时间延长到 00:10:00 或将记录的时间戳TRUNC
到最接近的分钟。
编辑:
如果你的从和到只精确到分钟,我会这样做:
SELECT *
FROM mytable
WHERE date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI')
AND date_field < to_date(#to#, 'YYYY/MM/DD HH24:MI') + 1/24/60/60 /* 1 minute */
并确保将绑定变量用于 from 和 to。 这是ColdFusion吗?如果是这样,请使用 cfqueryparam
。