如何在我的SQL查询中包含TIME以便在两个日期之间查找数据?

时间:2019-01-02 23:15:51

标签: sql oracle

我正在尝试获取两个日期之间的数据,该日期应该包含秒数

我当前正在使用以下代码,效果很好;但是现在需要更精确地包含时间了。

where h.creation_time >= date '2017-01-01'
and h.CLOSED_TIME >= date '2018-12-16' and h.CLOSED_TIME <= date '2018-12-17' 

这是我尝试将代码更改为:

where (h.creation_time >= date '2017-01-01')
and (h.CLOSED_TIME between '2018-12-16 18:19:00' and '2018-12-16 18:20:00')

我应该期望在6:19 pm和6:20 pm(一分钟的时间范围)之间的所有结果。相反,它会吐出错误:

  

ORA-01861:文字与格式字符串不匹配

3 个答案:

答案 0 :(得分:3)

尝试使用to_date()进行显式转换。

WHERE h.creation_time >= to_date('2017-01-01', 'YYYY-MM-DD')
      AND h.closed_time BETWEEN to_date('2018-12-16 18:19:00', 'YYYY-MM-DD HH24:MI:SS')
                                AND to_date('2018-12-16 18:20:00', 'YYYY-MM-DD HH24:MI:SS')

答案 1 :(得分:2)

时间戳字面量以关键字TIMESTAMP开头(就像日期字面量以DATE开头)

where h.creation_time >= date '2017-01-01'
and h.closed_time between timestamp '2018-12-16 18:19:00' and timestamp '2018-12-16 18:20:00'

为了将几分之一秒考虑在内,您不应该使用BETWEEN,但是:

where h.creation_time >= date '2017-01-01'
and h.closed_time >= timestamp '2018-12-16 18:19:00' 
and h.closed_time < timestamp '2018-12-16 18:20:00'

答案 2 :(得分:0)

  

下午6:19到6:20 pm(一分钟的时间范围)内的所有内容

这里提出的问题不仅是技术问题,还包括语言问题。 “之间”一词可能有一些细微的差异,例如在门柱之间行驶(即希望汽车不会撞到任何一侧,因此不包括门柱)或在伦敦之间飞行和巴黎(两个城市都包括在内),否则您就达不到目的地了。

SQL标准在两者之间使用后一种方法,它被定义为包括两个端点。对于日期/时间范围,这是一个潜在的问题,因为它可能导致端点的重复计数。正如@mathguy在该问题下的出色评论中指出的那样,更严格的方法是避免使用,并以这种方式明确定义范围:

WHERE h.creation_time >= to_date('2017-01-01', 'YYYY-MM-DD')
AND h.closed_time >= to_date('2018-12-16 18:19:00', 'YYYY-MM-DD HH24:MI:SS')
AND h.closed_time  < to_date('2018-12-16 18:20:00', 'YYYY-MM-DD HH24:MI:SS')

如果closed_time列是date数据类型,请使用to_date()

如果closed_time列是timestamp数据类型,请改用to_timestamp()