我的oracle查询中的日期格式

时间:2014-09-11 17:03:37

标签: sql oracle oracle11g

我正在尝试运行以下选择查询,并将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错误。

3 个答案:

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