我在做这个查询:
select xx.number,
xx.timestamp
from table xx
where number = 6
and timestamp = to_timestamp('09/09/99', 'DD/MM/RR');
其中number = NUMBER(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个六和它的日期时间(好)
但是,当我使用这两个条件进行查询时,它永远不会返回任何内容。我猜它是因为第一个查询返回错误的输出。
任何想法?
答案 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
,而是00
或20
。
因此,您的时间戳不匹配的原因是他们没有相同的世纪。您需要确定表格中的数据是否存在错误,以及该年份是99
,1999
还是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)