我查询的表的日期存储为varchar2。我需要使用BETWEEN sysdate-1 AND sysdate-30
将存储为varchar2的日期与sysdate进行比较(以返回上个月的varchar2日期)。
指定TO_DATE(varchar2, 'DD-MON-YYYY')
时出现错误“文字与格式字符串不匹配”。
我很困惑,因为Oracle文档说从varchar2转换时这是TO_DATE()
的可接受格式。
更新:这是一个公司数据库,我没有设计数据库,只能使用我可用的数据库。数据集非常庞大,并且每天都有超过10,000台设备自动更新SCADA设备。
SELECT device_name, read_date, sysdate
FROM oracle_database
------- Data Returned by query --------
device_name read_date sysdate
Device 1 5/14/2013 22-Sep-14
Device 2 5/14/2013 22-Sep-14
Device 3 5/14/2013 22-Sep-14
Device 4 5/14/2013 22-Sep-14
Device 5 5/14/2013 22-Sep-14
Device 6 5/14/2013 22-Sep-14
Device 7 5/14/2013 22-Sep-14
使用TO_DATE的结果
SELECT device_name,TO_DATE(read_date,'DD-MON-YY'),sysdate
-------查询返回的数据----------
ORA-01861:literal与格式字符串
不匹配
答案 0 :(得分:1)
根据您的数据,正确的格式很可能是MM/DD/YYYY
。它将匹配单个和两位数月或日。
MM
:从01到12的月份(默认情况下,前导0
不是强制性的)\
:任何标点符号DD
:从01到31的日期(默认情况下,0
不是强制性的)\
:任何标点符号YYYY
:年有关详细信息,请参阅Oracle的documentation about datetime Format Models 。
以下是示例:
-- Some test data
WITH testdata AS (
SELECT '5/14/2013' as d FROM DUAL
UNION SELECT '05/14/2013' FROM DUAL
UNION SELECT '5/1/2013' FROM DUAL
UNION SELECT '5/01/2013' FROM DUAL
UNION SELECT '6-6-2013' FROM DUAL)
-- Actual query demonstrating the use of the MM/DD/YYYY format
select d, TO_DATE(d,'MM/DD/YYYY') FROM testdata
产:
D TO_DATE(D,'MM/DD/YYYY')
05/14/2013 05/14/2013
5/01/2013 05/01/2013
5/1/2013 05/01/2013
5/14/2013 05/14/2013
6-6-2013 06/06/2013
如果您确实需要强制执行日期组件由/
(而不是任何其他标点符号)分隔的事实,则应使用fxfmMM/DD/YYYY
代替:
fx
标志强制严格比较,标点符号和格式数字位数fm
标志放宽该比较以允许向上指定的数字答案 1 :(得分:1)
Maybe
答案 2 :(得分:0)
首先,您的设计存在缺陷。您永远不应该将DATE
作为VARCHAR2
数据类型。
其次,在比较日期并将date literal
转换为DATE
时,请始终在两侧指定相同的格式掩码。
要将字符串转换为日期,请使用具有正确格式掩码的TO_DATE
。
要将日期转换为字符串,请使用具有相同格式掩码的TO_CHAR
。
确保在比较表达式中的值时,explicitly
转换comparison operator
任意一侧的数据类型以避免implicit data type conversion
。
你必须阅读史蒂文斯的这篇优秀文章,http://edstevensdba.wordpress.com/2011/04/07/nls_date_format/