【发布时间】:2017-06-24 13:29:19
【问题描述】:
我有一列用于在 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');
我想知道第一种方法是如何工作的,因为列 starttime 以 VARCHAR 格式存储,并且在不转换为时间戳的情况下,比较仍然有效。有人可以向我解释这是如何/为什么会发生的,或者是否有一些极端情况不起作用?谢谢。
【问题讨论】:
-
第一种方法也是如何工作的?它没有。它可能不会崩溃,但不会返回有意义的结果。如果您的格式类似于
YYYY-MM-DD,则按字母顺序仅适用于日期。 -
是的,我知道它不起作用。但是对于上述特殊情况,它起作用了。所以我只是想了解它在特定情况下是如何工作的。
-
'9/30/2016 14:00:00' - '9/30/2016 17:00:00'可能有效,但其他范围(例如'9/30/2016 20:00:00' - '12/1/2016 17:00:00')将失败。转换为TIMESTAMP(DATE)是正确的方法。 -
为什么字母排序在“一、二”中起作用,而在“四、五”中不起作用?纯属偶然。