Sql 从oracle发出查询日期的问题。
我知道查询日期会失败,因为它会将字符串与日期进行比较,这可能会导致问题 甲骨文11.2 G Unicode数据库 NLS\u日期\u格式DD-MON-RRSql 从oracle发出查询日期的问题。,sql,sqldatatypes,oracle11gr2,Sql,Sqldatatypes,Oracle11gr2,我知道查询日期会失败,因为它会将字符串与日期进行比较,这可能会导致问题 甲骨文11.2 G Unicode数据库 NLS\u日期\u格式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
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';
如果有人能详细说明或纠正我的心态。
谢谢Oracle确实允许日期文字,但它们取决于安装(特别是NLS\u date\u格式的值,如前所述)。因此,没有通用格式将单个字符串解释为日期(除非使用date
关键字)
默认格式为DD-MM-YY,这似乎是服务器的格式。因此,你的声明:
where Q_date = '07-JAN-08'
使用此格式解释
我更喜欢使用ISO标准YYYY-MM-DD格式的DATE
关键字:
where Q_Date = DATE '2008-01-07'
如果未返回任何行:
select * from table where Q_date='16-Mar-09';
但这确实可以看到数据:
select * from table where trunc(Q_date) = TO_DATE('16-MAR-09', 'DD-MON-YY');
然后你有一排时间不是午夜的。在本世纪的这一点上,DD-MON-RR和DD-MON-YY是等价的,两者都将09视为2009年,因此日期部分是正确的。但是第一个将只找到时间为午夜的行,而第二个将通过trunc
剥离时间,这意味着两侧的日期都在午夜,因此相等
由于这也会找到数据:
select* from table where Q_date='07-JAN-08';
。。。那么你在那天午夜有几行。您可能还有其他时间的行,因此使用trunc版本检查计数可能很有用
您可以通过以下方式查看实际拥有的时间:
select to_char(q_date, 'YYYY-MM-DD HH24:MI:SS') from table;
如果您确实想确保一天中的所有时间都能抓到鱼,您可以使用以下范围:
select * from table where
q_date >= date '2009-03-16'
and q_date < date '2009-03-17';
从表中选择*,其中
q_date>=日期'2009-03-16'
和q_日期<日期'2009-03-17';
虽然听起来您希望所有时间都是午夜,这可能表明数据有问题。第一个查询是返回错误还是不返回任何结果?对不起,我应该澄清一下。第一个不返回任何行。第二个返回到该日期的所有行。第三个返回到该日期的所有行。有与2009年3月16日相关的行。谢谢。正如我所说,我已经检查了数据库的NLS_DATE_格式,它是DD-MON-RR。抱歉,我正在试图帮助通过即时消息客户端进行通信的人。@KyleK<代码>'07-JAN-08'
是“DD-MON-RR”格式的有效日期。因此,转换工作没有错误。