TO_CHAR 在比较两个时间戳时只考虑日期?
TO_CHAR only considering dates while comparing two time stamps?
在下面的查询条件中失败,但逻辑上它应该通过。 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<=07(第 7 天是今天的日期)。无论月份如何,第一个条件都得到满足,year.if 我将 value1 更改为 '15/08/2014 12:30:10'
它失败了。与第二个条件相同。
你必须使用 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');
为什么要将日期作为字符串进行比较?这也回避了为什么首先将日期存储为字符串的问题。您应该使用内置类型存储 date/times。
试试这个:
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
不会以相同的方式进行比较。事实上,这就是为什么在字符串中存储 date/time 值时应该只使用 YYYY-MM-DD 的 ISO 格式(反正我在大多数情况下不推荐这样做)。
如果您的值已经以正确的类型存储,那么您可以这样做:
SELECT data
FROM table1
WHERE value1 <= sysdate AND
value2 >= sysdate;
如果这些是带时区的时间戳,那么您可以使用 SYSTIMESTAMP
而不是 SYSDATE
。
经过大量谷歌搜索,我终于找到了解决方案。以下查询对我有用 :) :)
SELECT留言
从表 1
WHERE TO_TIMESTAMP(value1, 'DD/MM/RRRR HH24:MI:SS') <= CAST(SYSDATE AS TIMESTAMP)
AND TO_TIMESTAMP(value2, 'DD/MM/RRRR HH24:MI:SS') >= CAST(SYSDATE AS TIMESTAMP);
value1='02/07/2014 12:30:10'
value2='06/08/2015 09:57:33'
在下面的查询条件中失败,但逻辑上它应该通过。 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<=07(第 7 天是今天的日期)。无论月份如何,第一个条件都得到满足,year.if 我将 value1 更改为 '15/08/2014 12:30:10'
它失败了。与第二个条件相同。
你必须使用 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');
为什么要将日期作为字符串进行比较?这也回避了为什么首先将日期存储为字符串的问题。您应该使用内置类型存储 date/times。
试试这个:
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
不会以相同的方式进行比较。事实上,这就是为什么在字符串中存储 date/time 值时应该只使用 YYYY-MM-DD 的 ISO 格式(反正我在大多数情况下不推荐这样做)。
如果您的值已经以正确的类型存储,那么您可以这样做:
SELECT data
FROM table1
WHERE value1 <= sysdate AND
value2 >= sysdate;
如果这些是带时区的时间戳,那么您可以使用 SYSTIMESTAMP
而不是 SYSDATE
。
经过大量谷歌搜索,我终于找到了解决方案。以下查询对我有用 :) :)
SELECT留言 从表 1 WHERE TO_TIMESTAMP(value1, 'DD/MM/RRRR HH24:MI:SS') <= CAST(SYSDATE AS TIMESTAMP) AND TO_TIMESTAMP(value2, 'DD/MM/RRRR HH24:MI:SS') >= CAST(SYSDATE AS TIMESTAMP);
value1='02/07/2014 12:30:10' value2='06/08/2015 09:57:33'