在 SQL Oracle 中筛选时间戳列

filter timestamp column in SQL Oracle

我有一个带有时间戳列的 table,我需要在“2020-08-26”之后进行过滤,但每个解决方案都行不通

RUN_TIME
2020-07-22 04:22:07
2020-07-22 04:34:07
2020-07-22 04:45:07
2020-07-22 04:50:07
2020-07-22 04:55:08

我尝试了以下查询:

WHERE CAST (RUN_DATE AS DATE) >= TO_DATE('2020-08-26', 'yyyy-mm-dd')

WHERE to_date(RUN_DATE, 'YYYY-MM-DD hh24:mi:ss') >= to_date('26-08-2020 23:59:59', 'YYYY-MM-DD hh24:mi:ss')

WHERE RUN_DATE >= TO_TIMESTAMP('26-08-2020 23:59:59')

刚刚:

where run_date >= date '2020-08-26'

这是针对 date 文字的直接过滤。

run_date 已经是 timestamp,因此您不应尝试转换它。此外,to_timestamp() 接受第二个参数,它指定字符串的格式;没有它,它默认为您的会话(或数据库)的 nls_timestamp_format,这可能不是您期望的

使用 TIMESTAMP 文字:

SELECT *
FROM   table_name
WHERE  run_time >= TIMESTAMP '2020-08-27 00:00:00';

或者,使用 DATE 文字:

SELECT *
FROM   table_name
WHERE  run_time >= DATE '2020-08-27';

或者,将 TO_TIMESTAMP 与格式模型一起使用:

SELECT *
FROM   table_name
WHERE  run_time >= TO_TIMESTAMP( '2020-08-27', 'YYYY-MM-DD' );

或者,将 TO_DATE 与格式模型一起使用:

SELECT *
FROM   table_name
WHERE  run_time >= TO_DATE( '2020-08-27', 'YYYY-MM-DD' );

其中示例数据:

CREATE TABLE TABLE_NAME ( run_time TIMESTAMP(6) );

INSERT INTO table_name ( run_time )
SELECT TIMESTAMP '2020-07-22 04:22:07' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-07-22 04:34:07' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-07-22 04:45:07' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-07-22 04:50:07' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-07-22 04:55:08' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-08-26 23:59:59.999999' FROM DUAL UNION ALL
SELECT TIMESTAMP '2020-08-27 00:00:00' FROM DUAL;

全部输出:

| RUN_TIME                  |
| :------------------------ |
| 27-AUG-20 00.00.00.000000 |

db<>fiddle here