我有一个列用于将日期和时间数据存储在我的 Oracle 11g Express 数据库中的 VARCHAR2 列中,格式为:
2016 年 9 月 30 日 14:00:00
我正在尝试获取不同时间范围内的数据的方法。我发现了以下两种方式:
select *
from dummy
WHERE starttime > '9/30/2016 14:00:00'
AND starttime < '9/30/2016 17:00:00'
order by starttime;
select *
from dummy
WHERE to_timestamp(starttime, 'mm/dd/yyyy hh24:mi:ss') > TO_TIMESTAMP('9/30/2016 14:00:00', 'mm/dd/yyyy hh24:mi:ss')
AND TO_TIMESTAMP(starttime, 'mm/dd/yyyy hh24:mi:ss') < TO_TIMESTAMP('9/30/2016 17:00:00', 'mm/dd/yyyy hh24:mi:ss');
我想知道第一种方法如何工作,因为列开始时间以 VARCHAR 格式存储,并且在不转换为时间戳的情况下比较仍然有效。有人可以向我解释如何/为什么会发生这种情况,或者是否存在某些无法解决的极端情况?谢谢。
请您参考如下方法:
之所以可行,是因为您对月份和年份或一位数天数与两位数天数没有任何问题。想一想“9/30/2016 14:00:00”到“9/30/2016 17:00:00”范围内的任何字符串。它们都必须以“9/30/2016 1”开头。
如果在范围内,比如“9/30/2016 14:00:00”到“10/30/2016 17:00:00”,你根本找不到任何记录,因为字符串会有从 >= '9' 和 <= '1' 开始,这是不可能的。
因此,正是特定日期内的窄幅波动让您在这里 :-)