oracle中的日期列

Date column in oracle

我有一个关于 oracle 中日期列的简单问题

假设我有一个名为 orders 的 table,其中只有几个字段,如 orderid、orderdate、orderno 等。

我想要 orderno 之类的信息,即特定日期的订单数量。 为了对此进行测试,我在我的测试应用程序上创建了一些订单。我写了下面的查询

SELECT orderid,orderno FROM orders WHERE orderdate='29-SEP-16'; 

我在查询中提到的日期格式是正确的。上面的查询returns什么都没有。如果我将 where 条件更改为 >'28-SEP-16' 它会起作用。

为什么我的第一个查询不起作用?

A date 列没有格式(好吧,date 确实有一个非常非人类可读的特定打包二进制表示)。 Oracle 将尝试使用会话的 nls_date_format 将字符串隐式转换为日期,并将使用会话的 nls_date_format 显示日期的字符串表示形式(假设您的客户端应用程序不覆盖这些)。但是,您不应依赖隐式数据类型转换。您应该真正使用日期文字或使用 to_date 进行显式转换。

date 列始终包含时间。您的 nls_date_format 可能包含也可能不包含时间部分,因此可能会或可能不会显示时间部分。但它一直都在。

假设您的nls_date_formatdd-mon-rr,查询

SELECT orderid,orderno 
  FROM orders 
 WHERE orderdate='29-SEP-16'; 

将显示 orderdate 为 2016 年 9 月 29 日午夜的所有订单。它不会显示时间分量是午夜之后的任何行。您可以通过进行不等式比较来解决这个问题。使用日期文字,即

SELECT orderid,orderno 
  FROM orders 
 WHERE orderdate >= date '2016-09-29';

SELECT orderid,orderno 
  FROM orders 
 WHERE orderdate >= date '2016-09-29'
   AND orderdate <  date '2016-09-30';

如果你想指定一个范围。或者,您可以截断 orderdate 的时间部分并进行相等比较。我将在此处显示 to_date 用于显式转换的用法

SELECT orderid,orderno 
  FROM orders 
 WHERE trunc(orderdate) = to_date( '29-SEP-16', 'DD-MON-RR' )

但是,如果这样做,您可能需要 trunc(orderdate).

上的基于函数的索引