oracle中如何获取两个时间戳之间的记录?

问题描述 投票:0回答:4

我在 Oracle 中有一个 TIMESTAMP(6) 数据类型列,其值类似于 2022-04-01 18:02:42,我想获取两个日期时间之间的所有记录。我尝试了如下但没有运气,

select * from table 
where column BETWEEN '2022-04-01 18:02:42' and '2022-11-03 19:28:57' -- no records

也尝试过这个,

select * 
from table 
where column BETWEEN to_date('2022-04-01','yyyy-mm-dd') 
                 and to_date('2022-11-03','yyyy-mm-dd') -- a non-numeric character was found where a numeric was expected

并且,

select * 
from table 
where column BETWEEN to_timestamp('2022-04-01','yyyy-mm-dd') 
                 and to_timestamp('2022-11-03','yyyy-mm-dd') -- a non-numeric character was found where a numeric was expected.

我想获取这个日期的记录!

谢谢。

sql oracle timestamp
4个回答
0
投票

您需要使用 TO_DATE 和所需的格式掩码将文字转换为 DATE,以将时间戳列与输入时间戳值进行比较。


SQL> CREATE TABLE t(A TIMESTAMP);

Table created.

SQL>
SQL> INSERT INTO t(A) VALUES(to_date('2022-04-10T15:39:00', 'YYYY-MM-DD"T"HH24:MI:SS'));

1 row created.

SQL> INSERT INTO t(A) VALUES(to_date('2022-05-01T15:39:00', 'YYYY-MM-DD"T"HH24:MI:SS'));

1 row created.

SQL> INSERT INTO t(A) VALUES(to_date('2022-03-01T15:39:00', 'YYYY-MM-DD"T"HH24:MI:SS'));

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM t;

A
----------------------------
10-APR-22 03.39.00.000000 PM
01-MAY-22 03.39.00.000000 PM
01-MAR-22 03.39.00.000000 PM

SELECT *
     FROM t
  WHERE A BETWEEN
            to_date('2015-04-06T15:39:00', 'YYYY-MM-DD"T"HH24:MI:SS')
             AND
            to_date('2022-05-06T15:39:00', 'YYYY-MM-DD"T"HH24:MI:SS');

A
--------------------------------------------------------------------------
10-APR-22 03.39.00.000000 PM
01-MAY-22 03.39.00.000000 PM


0
投票

使用

TIMESTAMP
文字:

SELECT *
FROM   table_name
WHERE  column_name BETWEEN TIMESTAMP '2022-04-01 18:02:42'
                   AND     TIMESTAMP '2022-11-03 19:28:57';

DATE
INTERVAL DAY TO SECOND
文字:

SELECT *
FROM   table_name
WHERE  column_name BETWEEN DATE '2022-04-01' + INTERVAL '18:02:42' HOUR TO SECOND
                   AND     DATE '2022-11-03' + INTERVAL '19:28:57' HOUR TO SECOND;

TO_TIMESTAMP
:

SELECT *
FROM   table_name
WHERE  column_name BETWEEN TO_TIMESTAMP('2022-04-01 18:02:42', 'YYYY-MM-DD HH24:MI:SS')
                   AND     TO_TIMESTAMP('2022-11-03 19:28:57', 'YYYY-MM-DD HH24:MI:SS');

TO_DATE
:

SELECT *
FROM   table_name
WHERE  column_name BETWEEN TO_DATE('2022-04-01 18:02:42', 'YYYY-MM-DD HH24:MI:SS')
                   AND     TO_DATE('2022-11-03 19:28:57', 'YYYY-MM-DD HH24:MI:SS');

0
投票

我也面临这个问题很长一段时间,我的查询给了我结果,但还包括之前和之后日期的额外记录,这是不正确的。

旧查询(所有带注释的查询都运行,但给出了错误的结果):

select TO_0CHAR(time_stamp,'DD-MON-YYYY HH24:MI:SS') time_stamp, count(*) as count from TABLE_NAME where
--time_stamp between TO_TIMESTAMP('22-AUG-2023 00:00:00','DD-MON-YYYY HH24:MI:SS') and TO_TIMESTAMP('22-AUG-2023 23:59:59','DD-MON-YYYY HH24:MI:SS')
--time_stamp between TO_DATE('22-AUG-2023 00:00:00','DD-MON-YYYY HH24:MI:SS') and TO_DATE('22-AUG-2023 23:59:59','DD-MON-YYYY HH24:MI:SS')
time_stamp >= TO_DATE('22-AUG-2023 00:00:00','DD-MON-YYYY HH24:MI:SS') and time_stamp <= TO_DATE('22-AUG-2023 23:59:59','DD-MON-YYYY HH24:MI:SS')    
group by time_stamp order by time_stamp asc;

它可能适用于不同的场景,例如数字范围之间或仅日期等。但对于时间戳,它不会给出正确的结果。

新查询(正确结果!!!):

select TO_CHAR(time_stamp,'DD-MON-YYYY HH24:MI:SS') time_stamp, count(*) as count from TABLE_NAME where
TO_CHAR(time_stamp,'DD-MON-YYYY HH24:MI:SS') between '22-AUG-2023 00:00:00' and '22-AUG-2023 23:59:59'
group by time_stamp order by time_stamp asc;

在此查询中,我们将日期转换为字符串,然后获取给定时间戳字符串之间的结果。


-1
投票

首先必须更改 NLS_DATE_FORMAT 如下:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
ALTER SESSION SET NLS_DATE_FORMAT = 'HH24:MI:SS';

然后使用 TIMESTAMP 文字运行查询,如下所示:

SELECT * FROM   table_name WHERE  column_name BETWEEN TIMESTAMP '2022-04-01 18:02:42' AND     TIMESTAMP '2022-11-03 19:28:57';

© www.soinside.com 2019 - 2024. All rights reserved.