我正在尝试运行以下选择查询,并将date1的抛出错误视为无效月份:
SELECT rpad(REPLACE(DECODE(SUBSTR(m.alt_ch_rsp,1,3),'ABM','ATM','SOL','MC ','BRN','FFT','CC '),' ', NULL ),3, ' ')
FROM sp_mosaix m,
fbl_dis d,
sp_offer o
WHERE o.offer_id = m.offer_id
AND (TRUNC(to_date(m.date1,'yyyy/mm/dd')) < TRUNC(sysdate+10))
date1实际上是一个varchar2数据类型,我的数据库的NLS_DATE_FORMAT是&#34; DD-MON-RR&#34;。我想知道如何纠正并应用正确的日期转换,以便它不会抛出date1错误。
答案 0 :(得分:3)
更改为
to_date(m.date1,'dd/mm/yyyy')
用于to_date的模式应与文本格式相匹配 - 无论您的NLS_DATE_FORMAT是什么。
答案 1 :(得分:1)
您的格式需要与varchar2数据相对应,&#39; MM / DD / YYYY&#39;。由于您的date1数据遵循格式,&#39; 09/11 / 2014&#39;,此日期模型对应于&#39; MM / DD / YYYY&#39;。
ALTER session SET NLS_DATE_FORMAT='DD-MON-RR';
SCOTT@dev> WITH m AS
2 (SELECT '09/11/2014' date1 FROM dual
3 )
4 SELECT date1
5 FROM m
6 WHERE TRUNC(to_date(m.date1,'MM/DD/YYYY')) < TRUNC(sysdate+10)
7 /
DATE1
==========
09/11/2014
答案 2 :(得分:0)
实际问题在于您的数据类型。日期列必须始终是DATE数据类型。没有理由将它定义为VARCHAR2。
这不仅是一种不好的做法,而且,在线下,你将面临后果和副作用。它本质上是最基本的调整概念,但也非常重要。不要忘记由于隐式数据转换导致的性能问题。
作为一本好读物,你可以看看Ed Stevens的以下文章,我相信他是一名优秀的DBA:http://edstevensdba.wordpress.com/2011/04/07/nls_date_format/