Oracle SQL中有没有什么方法可以将特定格式的varchar转换为时间?

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

我有一个包含三列的表格,其中一列

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 oracle date formatting char
1个回答
0
投票

在我的数据库中,这是默认日期格式:

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
如您的示例所示。

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