【发布时间】:2014-09-22 15:58:36
【问题描述】:
我正在查询的表的日期存储为 varchar2。我需要使用BETWEEN sysdate-1 AND sysdate-30 将存储为 varchar2 的日期与 sysdate 进行比较(以返回上个月的 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 的结果
SELECT device_name, TO_DATE(read_date, 'DD-MON-YY'), 系统日期
------- 查询返回的数据 ----------
ORA-01861: 文字与格式字符串不匹配
【问题讨论】:
-
你能举例说明你的输入吗?
-
您必须使用与您实际存储的字符串相匹配的格式。你必须希望它们都采用相同的格式并且是有效的......它可能有一个尝试多种格式的函数,但这很混乱,尤其是。如果您有 DD/MM 和 MM/DD 日期的混合。这就是为什么不应将日期存储为字符串的原因...无论如何,如果您显示一些示例数据和它们所代表的日期(如果不明显),那么可以建议一个合适的模型。
-
@Alex,如果我尝试根据“为什么不将日期存储为字符串”来回答,我希望你不会介意。我已经包含了 Ed Stevens 关于它的文章的链接,这非常棒。我在任何地方都使用相同的链接来回答类似的问题。
-
@LalitKumarB - 虽然它是有效的,但我认为它不能解释 OP 看到的错误,或者如何处理它。 (除了存储为日期;但随后模型问题可能会转移到插入)。但是在知道字符串的格式之前,没什么好说的......
-
@Alex,如果他不确定 nls 设置,我想告诉 OP 用
nls_date_format更改他的会话,但我没有这样做,因为我的业余爱好者在查询级别格式上玩的比会话级别更多,并且它将覆盖会话级别设置。让我们看看 OP 告诉我们的更多细节。我将尝试根据 OP 的新输入即兴回答。
标签: sql oracle varchar to-date sysdate