Sql 我的oracle查询中的日期格式

Sql 我的oracle查询中的日期格式,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在尝试运行以下select查询,并将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

我正在尝试运行以下select查询,并将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_格式是DD-MON-RR。我想知道如何纠正并应用正确的日期转换,使其不会引发date1错误。

更改为

to_date(m.date1,'dd/mm/yyyy')

无论NLS_date_格式如何,您用于to_date的模式都应与文本的格式相匹配。

您的格式需要与varchar2数据“MM/DD/YYYY”相对应。由于日期1数据的格式为“09/11/2014”,因此此日期模型对应于“MM/DD/YYYY”

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

实际问题在于您的数据类型。日期列必须始终是日期数据类型。没有理由将其定义为VARCHAR2

这不仅是一种不好的做法,而且,今后,你将面临后果和副作用。这是自然界中最基本的调谐概念,但也非常重要。不要忘记隐式数据转换带来的性能问题


作为一本好的读物,你可以看看Ed Stevens的以下文章,我相信他是一位优秀的DBA:

date1中的文本实际上是什么样子的-例如?它就像数据库中的2014年11月9日那样如果你把日期格式搞错了…应该是to_datem.date1,'dd/mm/yyyy'作为与你的问题无关的题外话,看起来你有一个笛卡尔积fbl_dis的别名没有连接到任何东西。嗨,Patrick,因为代码很大,我刚刚复制粘贴了代码的一部分。说了这个FBI被使用了Hanks Jens,我会从Patricks的回答中检查这个问题我意识到到到datem.date1,'mm/dd/yyyy'可能是正确的答案-只有你能说。是的,当我们看到这一点时,我们都会退缩。很多时候,我们都要面对过去开发人员的罪恶,我们只能支持一些不太理想的东西。不幸的是,这是一个公司数据库,更不用说设计糟糕,现在我面临这个问题。