从oracle发出查询日期。

时间:2015-06-02 16:54:48

标签: sql sqldatatypes oracle11gr2

我理解查询日期会因为比较字符串到日期而失败,这可能会导致问题。

Oracle 11.2 G. Unicode DB NLS_DATE_FORMAT DD-MON-RR

select * from table where Q_date='16-Mar-09'; 

可以通过

解决
select * from table where trunc(Q_date) = TO_DATE('16-MAR-09', 'DD-MON-YY');

我不知道的是为什么这样做。

select* from table where Q_date='07-JAN-08';

如果有人能够详细说明或纠正我的心态。 感谢

2 个答案:

答案 0 :(得分:2)

Oracle 确实允许日期文字,但它们取决于安装(特别是DATE的值,如here所述)。因此,没有通用格式将单个字符串解释为日期(除非您使用where Q_date = '07-JAN-08' 关键字)。

默认格式为DD-MM-YY,它似乎是服务器的格式。所以,你的陈述:

DATE

使用此格式进行解释。

我更喜欢使用ISO标准YYYY-MM-DD格式的where Q_Date = DATE '2008-01-07' 关键字:

(^"[^"]*)(?:"([^"]*)")?([^"]*?")

答案 1 :(得分:0)

如果没有返回任何行:

reinterpret_cast

但确实会看到数据:

select * from table where Q_date='16-Mar-09'; 

然后你的行的时间不是午夜。在本世纪的这一点上,DD-MON-RR和DD-MON-YY是等价的,两者都将09视为2009年,因此日期部分是正确的。但是第一个只会找到时间是午夜的行,而第二个是通过select * from table where trunc(Q_date) = TO_DATE('16-MAR-09', 'DD-MON-YY'); 剥离时间,这意味着两边的日期都是午夜,因此相等。

因为这也找到了数据:

trunc

...那时你在那天的午夜有行。您可能有其他时间的行,因此使用trunc版本检查计数可能会有用。

您可以查看实际拥有的时间:

select* from table where Q_date='07-JAN-08';

如果您确实希望在一天内捕获所有时间,则可以使用范围:

select to_char(q_date, 'YYYY-MM-DD HH24:MI:SS') from table;

Quick SQL Fiddle demo

虽然听起来好像你希望所有时间都是午夜,这可能表明存在数据问题。