0

我的查询类似于:

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 之间的记录,这就是我想要的。

4

4 回答 4

1

between 子句接受两个区间界限。我向您建议第二种选择

select *
from mytable
where date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI')
   < to_date(#to#, 'YYYY/MM/DD HH24:MI')

你可能会觉得这篇文章很有趣。

于 2012-08-12T14:40:57.397 回答
0

日期转换会将值转换为包含所有日期元素的日期。您没有在字符串中指定秒数,因此这些将变为 0。

换言之,不包括范围“:01” - “:59”。

由于您正在使用字符串并且字符串具有正确的比较顺序的日期元素,为什么不进行字符串比较:

where to_char(datefield, 'YYYY/MM/DD HH24:MI') between #from# and #to#

我认为这正是您想要的,而无需摆弄日期算术。

您还可以根据建议更改语句,方法是增加#to# 列并使用“<”而不是 between。

于 2012-08-11T15:59:42.247 回答
0

忽略元素的日期部分DATE,因为 00:09:01 和 00:09:59 都在您的“到”时间 00:09:00 之后,不,此查询将不包括这些记录。

如果要包含这些记录,则需要将“到”时间延长至 00:10:00,或TRUNC将记录的时间戳延长至最接近的分钟。

编辑:

如果您的 from 和 to 仅精确到分钟,我会这样做:

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.

于 2012-08-11T15:04:21.047 回答
0

你可以这样做:

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')
于 2012-08-11T17:48:16.140 回答