TO_CHAR在比较两个时间戳时只考虑日期?

时间:2015-01-07 12:22:06

标签: sql oracle

在下面的查询条件失败但逻辑上它应该通过。 to_char ??

有问题
SELECT data
FROM table1
WHERE
TO_CHAR(TO_DATE(value1, 'DD/MM/RRRR HH24:MI:SS'), 'DD/MM/RRRR HH24:MI:SS') <= 
   TO_CHAR( SYSDATE, 'DD/MM/RRRR HH24:MI:SS')
 AND TO_CHAR(TO_DATE(value2, 'DD/MM/RRRR HH24:MI:SS'), 'DD/MM/RRRR HH24:MI:SS') >=
    TO_CHAR( SYSDATE, 'DD/MM/RRRR HH24:MI:SS');

value1='02/07/2014 12:30:10'
value2='06/08/2015 09:57:33'

在两种情况下它只检查日期,即02&lt; = 07(第7天是今天的日期)。无论月份和年份如何,第一个条件都得到满足。如果我将value1更改为'15/08/2014 12:30:10'则失败。与第二个条件相同。

3 个答案:

答案 0 :(得分:4)

为什么要将日期比较为字符串?这也引出了为什么你首先将日期存储为字符串的问题。您应该使用内置类型存储日期/时间。

请改为尝试:

SELECT data
FROM table1
WHERE TO_DATE(value1, 'DD/MM/RRRR HH24:MI:SS') <= sysdate AND
      TO_DATE(value2, 'DD/MM/RRRR HH24:MI:SS') >= sysdate;

您的问题可能是您正在比较字符串而不是日期。您使用的格式DD/MM/YYYY不会以相同的方式进行比较。事实上,这就是为什么只要在字符串中存储日期/时间值时就应该使用YYYY-MM-DD的ISO格式(在大多数情况下我不建议这样做)。

如果您的值已经存储在适当的类型中,那么您可以这样做:

SELECT data
FROM table1
WHERE value1 <= sysdate AND
      value2 >= sysdate;

如果这些是带时区的时间戳,那么您可以使用SYSTIMESTAMP代替SYSDATE

答案 1 :(得分:1)

最后经过大量的谷歌搜索我得到了解决方案。下面的查询对我有用:):)

选择消息 FROM TABLE1 在哪里TO_TIMESTAMP(值1,&#39; DD / MM / RRRR HH24:MI:SS&#39;)&lt; = CAST(SYSDATE AS TIMESTAMP) AND TO_TIMESTAMP(value2,&#39; DD / MM / RRRR HH24:MI:SS&#39;)&gt; = CAST(SYSDATE AS TIMESTAMP);

value1 =&#39; 02/07/2014 12:30:10&#39; value2 =&#39; 06/08/2015 09:57:33&#39;

答案 2 :(得分:0)

你必须使用TO_TIMESTAMP而不是TO_DATE:

SELECT data
FROM table1
WHERE  
TO_CHAR(TO_TIMESTAMP(value1, 'DD/MM/RRRR HH24:MI:SS'), 'DD/MM/RRRR HH24:MI:SS') <= 
   TO_CHAR( SYSDATE, 'DD/MM/RRRR HH24:MI:SS')
  AND TO_CHAR(TO_TIMESTAMP(value2, 'DD/MM/RRRR HH24:MI:SS'), 'DD/MM/RRRR HH24:MI:SS') >=
    TO_CHAR( SYSDATE, 'DD/MM/RRRR HH24:MI:SS');