查询where子句

时间:2017-06-22 07:55:41

标签: sql oracle

我在做这个查询:

select xx.number, 
       xx.timestamp 
  from table xx
 where number = 6
   and timestamp = to_timestamp('09/09/99', 'DD/MM/RR');

其中number = NUM​​BER(3,0)(可以重复,因为它不是PK也不是FK)AND timestamp = TIMESTAMP(6)(也可以重复)。

有这样的记录

9 - 09/09/99 00:00:00,000000000 
1 - 07/03/17 10:23:05,337000000
2 - 28/02/17 18:18:18,666000000
4 - 16/02/17 13:53:17,058000000
6 - 09/09/99 00:00:00,000000000
6 - 09/09/99 00:00:00,000000000
1 - 24/02/17 09:36:07,382000000
8 - 09/09/99 00:00:00,000000000

问题是,当我这样做时

select xx.number, 
       xx.timestamp 
  from table xx
 where timestamp = to_timestamp('09/09/99', 'DD/MM/RR');

它只返回1 8和1 9(不好),它也应该有2个6个

当我做的时候

select xx.number, 
       xx.timestamp 
  from table xx
 where number = 6;

它返回2个六和它的日期时间(好)

但是,当我使用这两个条件进行查询时,它永远不会返回任何内容。我猜它是因为第一个查询返回错误的输出。

任何想法?

3 个答案:

答案 0 :(得分:2)

[TL / DR]请勿使用RR格式模型使用YYYY,并在插入和过滤数据时传递4位数年份。

问题可能是您用来显示和解析日期的RR格式。

如果你这样做:

select xx.number, 
       TO_CHAR( xx.timestamp, 'YYYY-MM-DD HH24:MI:SS.FF9 ) 
from   table xx
here   number IN (6, 8, 9);

我怀疑你会得到输出:

9 1999-09-09 00:00:00.000000000 
6 2099-09-09 00:00:00.000000000
6 2099-09-09 00:00:00.000000000
8 1999-09-09 00:00:00.000000000

编号为6的行的世纪不是19,而是0020

因此,您的时间戳不匹配的原因是他们没有相同的世纪。您需要确定表格中的数据是否存在错误,以及该年份是991999还是2099并修复该问题 - 那么您的查询应该有效。

但是,您还应该首先调查为什么。通常使用以下任一插入语句:

  • TO_TIMESTAMP( your_date, 'DD/MM/YYYY' )09/09/99格式传递输入,因此数据库假定年份为0099;或
  • TO_TIMESTAMP( your_date, 'DD/MM/YY' )正在以09/09/99格式传递输入,因此当您期望2099时,数据库假定年份为1999(在当前世纪)应该使用格式模型DD/MM/RR

更好的解决方法是始终使用4位数年份。

答案 1 :(得分:0)

尝试使用'DD / MM / YY'并检查是否会出现相同的结果,因为'99'在数据库中也可能表示1899(尽管不太可能)

答案 2 :(得分:-1)

试试这个,如果你使用'分组'和日期它会起作用,但如果你使用时间我将带给你多行

 select xx.number, 
           cast(xx.timestamp  as date) as timestamp  
      from table xx
     where number = 6;
    group by number,cast(xx.timestamp  as date)