我有这个 Oracle 数据库,它有一个格式如下的日期列表:mm/dd/yy 0:00:00 AM/PM
(1 代表一月,而不是 01;1 代表当天,而不是 01,等等)。
当我尝试查询时,例如:
select DATELIST from CORE.DATE_TEST
where to_date(DATELIST) >= to_date('8/27/2015', 'mm/dd/yy') AND to_date(DATELIST, 'mm/dd/yy') <= to_date('9/27/2015', 'mm/dd/yy');
它给了我以下错误:ORA-01843: not a valid month
。我也看不出 27 是一个有效的月份,但如果我尝试它会接受该输入
当我尝试将其更改为预期的日期格式时:
m/dd/yy
mm/dd/yyyy
m/d/yy
我收到此错误:ORA-01821: date format not recognized
当我将它切换到 时dd/mm/yy
,它有点工作,但不是真的;它给了我无效的结果。
但是,这有效:
select DATELIST from CORE.DATE_TEST
where to_date(DATELIST) >= to_date('8/27/2015', 'mm/dd/yy')
PL/SQL 脚本打破了以下添加:
AND to_date(DATELIST, 'mm/dd/yy') <= to_date('9/27/2015', 'mm/dd/yy');
当我用这个替换上面的代码时:
SELECT to_date(DATELIST, 'dd/mm/yy')
FROM CORE.DATE_TEST
WHERE DATELIST >= to_date('8/27/2015', 'mm/dd/yy')
AND DATELIST <= to_date('9/27/2015', 'mm/dd/yy');
它有效,速度快了一百万倍,但它无法正确解析日期范围。小于或等于 ( <=
) 运算符仅在8/27/2015
, 和之间获取数据9/26/2015
。不是应该从 2015 年 8 月 27 日到 2015 年 9 月 27 日吗?
所以我把最后一行改成这样:
AND DATELIST <= to_date('9/27/2015', 'mm/dd/yy') + 1
...并且它有效,但似乎我没有正确处理这个问题。
我究竟做错了什么?此外,如果有更好、更有效的方法来做到这一点,我会全力以赴。