Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从oracle发出查询日期的问题。_Sql_Sqldatatypes_Oracle11gr2 - Fatal编程技术网

Sql 从oracle发出查询日期的问题。

Sql 从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

我知道查询日期会失败,因为它会将字符串与日期进行比较,这可能会导致问题

甲骨文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 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”格式的有效日期。因此,转换工作没有错误。