在下面的查询条件失败但逻辑上它应该通过。 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'
则失败。与第二个条件相同。
答案 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');