我有一个包含三列的表格,其中一列
ateststatus_date
具有以下格式:例如:
28-MAY-24 11.57.20.000000 PM
它被定义为
varchar(2)
。我使用 To_date()
和 To_timestamp()
甚至 substring()
来使用它获取 2024 年 4 月的数据。
不幸的是,这些方法都不起作用。我已经厌倦了为此挣扎。任何针对此类格式的解决方案将不胜感激。
我使用的方法之一:
SELECT *
FROM TABLE
WHERE TO_TIMESTAMP(lateststatus_date, 'DD-MON-RR HH.MI.SS.FF AM')
BETWEEN TO_TIMESTAMP('01-APR-24 00:00:00.000000', 'DD-MON-RR HH24:MI:SS.FF')
AND TO_TIMESTAMP('30-APR-24 23:59:59.999999', 'DD-MON-RR HH24:MI:SS.FF');
在我的数据库中,这是默认日期格式:
SQL> select sysdate from dual;
SYSDATE
--------
26.07.24
为了更明显,我将其更改为
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
26.07.2024 07:10:47
值 - 代表一个 日期 - 在你的情况下将是
SQL> with test (col) as
2 (select '28-MAY-24 11.57.20.000000 PM' from dual)
3 select to_date(substr(col, 1, 9), 'dd-mon-yy', 'nls_date_language = english') result
4 from test;
RESULT
-------------------
28.05.2024 00:00:00
SQL>
这是一个日期数据类型值。它默认为午夜,因为你没有说你需要时间组件。
就您的查询而言,它不会从
lateststatus_date
上可能的索引中受益(如果性能不好,也许您可以/应该创建基于函数的索引?),因此您可以将其设置为
select *
from your_table
where to_char(to_date(substr(lateststatus_date, 1, 9),
'dd-mon-yy', 'nls_date_language = english'), 'yyyymm') = '202404'
即无需使用
between
如您的示例所示。