我试图创建一个where子句,该子句可以返回一个日期时间间隔,后面的表格更具体,我使用此查询:
select *
from tb_alarms c
where to_char(c.e3timestamp, 'dd/mm/yyyy hh24:mi') >= '13/09/2017 16:00'
and to_char(c.e3timestamp, 'dd/mm/yyyy hh24:mi') <= '14/09/2017 07:05'
但是,此查询返回带有e3timestamp字段的行,其值从14/06/2011 07:49:29开始,到14/09/2017 07:04:30结束。
为什么它会返回2011年的日期?是因为它比较了char而不是日期类型吗?
你们可以帮助我或指明我可以学习如何使用完整的日期时间间隔执行正确的where子句的来源吗?
谢谢!
OBS:e3timestamp是tb_alarms表中具有Date类型的字段。
答案 0 :(得分:3)
为什么它会返回2011年的日期?是因为它比较了char而不是日期类型?
是的,'13/09/2017 16:00'
是字符串文字而不是日期字面值 - 查询会将过滤条件的左侧和右侧比较为字符串而不是日期。
所以这些都是真的:
'13/09/2017 16:00' <= '14/09/0001 00:00'
'14/09/0001 00:00' <= '14/09/2017 07:05'
您想使用时间戳文字:
select *
from tb_alarms c
where c.e3timestamp BETWEEN TIMESTAMP '2017-09-13 16:00:00'
AND TIMESTAMP '2017-09-14 07:05:00'
或在字符串文字上使用TO_DATE
,而不是在日期/时间戳列上使用TO_CHAR
:
select *
from tb_alarms c
where c.e3timestamp >= TO_DATE( '13/09/2017 16:00', 'DD/MM/YYYY HH24:MI' )
AND c.e3timestamp <= TO_DATE( '14/09/2017 07:05', 'DD/MM/YYYY HH24:MI' )
答案 1 :(得分:0)
你必须使用to_date而不是to_char,也避免在列上使用函数,因为这会阻止使用索引:
select *
from tb_alarms c
where c.e3timestamp between to_date('13/09/2017 16:00','dd/mm/yyyy hh24:mi')
and to_date('14/09/2017 07:05','dd/mm/yyyy hh24:mi');