我在表r3的dat列中使用了时间戳。当我解雇命令
select dat from r3 where dat='16-nov-09';
它显示“没有选择行”,但是当我触发命令
时select dat from r3 where dat>'15-nov-09';
它显示了16-nov-09的全部数据。告诉我第一个命令或我必须做的事情有什么问题。
答案 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%'
会给你想要的输出。