如何在oracle中使用带有时间戳日期列的赋值运算符

时间:2009-11-17 06:50:33

标签: sql oracle

我在表r3的dat列中使用了时间戳。当我解雇命令

select dat from r3 where dat='16-nov-09';

它显示“没有选择行”,但是当我触发命令

select dat from r3 where dat>'15-nov-09';

它显示了16-nov-09的全部数据。告诉我第一个命令或我必须做的事情有什么问题。

7 个答案:

答案 0 :(得分:6)

在oracle日期列上查询总是令人困惑。日期columntype始终是日期时间。从sysdate存储当前日期也始终是时间组件。

有好的和邪恶的方式来查询日期列。我展示并投票一些。

where to_char(DAT, 'DD-MON-YYYY') = '16-NOV-2009'

where trunc(DAT) = to_date('16-NOV-2009', 'DD-MON-YYYY')

两者都不好,因为他们不使用任何索引。为避免这种情况,您可以在表达式上定义基于函数的索引。 两者的诀窍是切断时间组件。如果不需要时间,那么在INSERT和UPDATE触发器中切断时间是一个好建议。基于函数的索引可以转换为普通索引。

where DAT between to_date('16-NOV-2009', 'DD-MON-YYYY') 
          and to_date('16-NOV-2009 23:59:59', 'DD-MON-YYYY HH24:MI:SS')

where DAT >= to_date('16-NOV-2009', 'DD-MON-YYYY') and DAT < to_date('16-NOV-2009', 'DD-MON-YYYY')+1

这两个人总是我的最爱。 使用to_date和to_char来转换string和datetime之间的值是一个很好的建议。

答案 1 :(得分:2)

由于DAT是时间戳,您可以使用如下

select DAT from R3 
where DAT between to_date('16-NOV-09' , 'dd-MON-yy') and to_date('16-NOV-09 23:59:59', 'DD-MON-YY hh24:mi:ss')

答案 2 :(得分:1)

时间戳有时间和日期组件,所以查询

select dat from r3 where dat='16-nov-09';

仅适用于时间组件为午夜的记录:'00:00:00'

除格式化(to_date函数)外,您可以截断时间戳以仅获取日期:

select dat from r3 where trunc(dat)='16-nov-09';

请注意,这不会在字段dat上使用索引(如果有的话)。

答案 3 :(得分:1)

TIMESTAMP和DATE是oracle中的不同数据类型,并且都是存储时间组件。如果你确实需要存储亚秒,那么你使用TIMESTAMP,否则DATE是你的最佳选择。

ANSI时间戳和日期文字语法非常方便:

create table ts_test (ts1 timestamp);

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00'
/

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00.1'
/

select *
from   ts_test
where  ts1 > timestamp '2009-10-11 00:00:00.001'
/

select *
from   ts_test
where  ts1 = date '2009-10-11'
/

答案 4 :(得分:0)

使用以下格式作为条件的日期字段。

where to_char(DAT,'mmddyyyy') = '11152009';

答案 5 :(得分:0)

在Oracle中,日期字段也包含时间组件,因此16-nov-09实际上是11月16日午夜。

处理此问题的两种不同方法:

where to_char(DAT,'mmddyyyy') = '11152009'

正如约翰所建议的那样,但我更喜欢以下版本:

where trunc(dat) = to_date ('11152009', 'mmddyyyy')

TRUNC表示日期“删除”时间组件(或更具体地说,将其截断为午夜),而to_date是在Oracle SQL中构造日期值的正确方法。 (我更喜欢在正确的域中进行比较 - 在​​第二个示例中进行DATE - 而在另一个示例中进行比较 - 如第一个示例中的STRING。使用字符串可能会遇到一些奇怪的月问题,在日期等方面排序会更容易。)

答案 6 :(得分:-1)

只是添加它,当你不打扰时间戳而只是想比较日期时,一个简单的方法是使用'like'运算符。 例如

select dat from r3 where dat LIKE '16-nov-09%'

会给你想要的输出。