我的表格如下:
表Temp
:
ID MAX MIN DATE_C
1 34 24 21-APR-17 02.41.38.520000 PM
2 32 26 20-APR-17 02.42.44.569000 PM
我执行以下SQL查询以获取相应日期的温度详细信息:
SELECT *
FROM Temp t
WHERE t.date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD')
order by t.id
但是它返回了空记录。我的查询有什么问题?
答案 0 :(得分:3)
您需要删除列上的时间组件。这是一种方式:
SELECT *
FROM Temp t
WHERE TRUNC(t.date_c) = DATE '2017-04-21'
ORDER BY t.id;
但是,我通常建议使用不等式,而不是列上的函数:
SELECT *
FROM Temp t
WHERE t.date_c >= DATE '2017-04-21' AND
t.date_c < DATE '2017-04-22'
ORDER BY t.id;
这允许查询在date_c
上使用索引。我应该补充一点,原始版本可以使用(trunc(date_c, id)
上的索引。
答案 1 :(得分:1)
21-APR-17 02.41.38.520000 PM
不是DATE
;它有一个小数秒组件,因此它是TIMESTAMP
。
因此,如果您想查找特定日期的项目(使用ISO/ANSI timestamp literal输入TIMESTAMP
):
SELECT *
FROM Temp
WHERE date_c >= TIMESTAMP '2017-04-21 00:00:00' AND
date_c < TIMESTAMP '2017-04-21 00:00:00' + INTERVAL '1' DAY;
或
SELECT *
FROM Temp
WHERE date_c >= TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) AND
date_c < TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) + INTERVAL '1' DAY;
它返回空记录。我的查询有什么问题?
date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD')
匹配date_c
值正好为2017-04-21 00:00:00.000000
的所有行(包括时间组件);如果你没有任何完全具有日期和时间的行,那么,正如你所注意到的那样,它什么也不会返回。如果您想获得与当天匹配的记录,那么您需要在一天的开始和结束之间的范围内获取值。
答案 2 :(得分:-3)
您需要在列上传递日期。这是一种方式......
SELECT *
FROM Temp t
WHERE CAST(t.CREATED_ON as date)= N'2017-04-22'
ORDER BY t.id