用于sysdate比较的Varchar2到Date

时间:2014-09-22 15:58:37

标签: sql oracle varchar to-date sysdate

我查询的表的日期存储为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与格式字符串

不匹配

3 个答案:

答案 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/