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_format
是dd-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)
.
上的基于函数的索引
我有一个关于 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_format
是dd-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)
.