如何通过to_date函数进行搜索?

时间:2017-04-21 12:16:01

标签: sql oracle

我的表格如下:

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

但是它返回了空记录。我的查询有什么问题?

3 个答案:

答案 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