1

我正在查询的表的日期存储为 varchar2。我需要使用 sysdate 比较存储为 varchar2 的BETWEEN sysdate-1 AND sysdate-30日期(从上个月返回 varchar2 日期)。

指定时TO_DATE(varchar2, 'DD-MON-YYYY')出现错误“文字与格式字符串不匹配”。

我被卡住了,因为 Oracle 文档说这是TO_DATE()从 varchar2 转换时可以接受的格式。

更新:这是一个公司数据库,我没有设计数据库,只能使用我可用的数据库。数据集非常庞大,由 SCADA 设备自动更新,每天超过 10,000 台设备。

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 的结果

选择设备名称,TO_DATE(读取日期,'DD-MON-YY'),系统日期

-------- 查询返回的数据 ----------

ORA-01861: 文字与格式字符串不匹配

4

3 回答 3

1

鉴于您的数据,正确的格式很可能是MM/DD/YYYY. 它将匹配一位数和两位数的月份或日期。

  • MM: 从 01 到 12 的月份(前导0默认不强制)
  • \:任何标点符号
  • DD: 从 01 到 31 的天数(0默认不强制前导)
  • \:任何标点符号
  • YYYY: 年

有关详细信息,请参阅 Oracle关于日期时间格式模型的文档

这是示例:

-- 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 标志放宽该比较以允许最多指定位数
于 2014-09-22T19:58:34.637 回答
1
SELECT device_name, TO_DATE(read_date, 'DD/MM/YYYY'), sysdate
于 2016-02-14T13:59:35.320 回答
0

首先,你的设计有缺陷。你不应该有DATEasVARCHAR2数据类型。

其次,在比较日期并将 a 转换date literal为 aDATE时,始终在两侧指定相同的格式掩码。

要将字符串转换为日期,请使用TO_DATE正确的格式掩码。

要将日期转换为字符串,请使用TO_CHAR相同的格式掩码。

确保在比较表达式中的值时,explicitly转换两侧的数据类型comparison operator以避免implicit data type conversion.

您必须阅读bEd Stevens 的这篇优秀文章,http ://edstevensdba.wordpress.com/2011/04/07/nls_date_format/

于 2014-09-22T16:11:59.740 回答