提取()24小时格式的小时

Ann*_*awn 10 oracle

我有类似下面的东西 -

EXTRACT(HOUR from CAST(to_char(tran_datetime,'DD-MON-YYYY HH24:MI:SS') AS TIMESTAMP))
Run Code Online (Sandbox Code Playgroud)

tran_datetimeDATE类型.这给某些行说错误HOUR must be between 1 and 12,所以我理解它无法处理24 Hour格式(或军事时间)的小时.以下作品(显然) -

EXTRACT(HOUR from CAST(to_char(tran_datetime,'DD-MON-YYYY HH:MI:SS') AS TIMESTAMP)) 
Run Code Online (Sandbox Code Playgroud)

要么

EXTRACT(HOUR from CAST(tran_datetime AS TIMESTAMP))  --12 Hr format by default
Run Code Online (Sandbox Code Playgroud)

有没有办法用来EXTRACT()获得HOUR24小时格式,即15下午3点,13点下午1点等.

请注意 - 这to_char(tran_datetime,'HH24')是一个非常明显的选择,但我希望EXTRACT()具体使用功能.

Ale*_*ole 19

问题不在于extract,这当然可以处理"军事时间".看起来你有一个默认的时间戳格式而HH不是HH24; 或者至少这是我能看到重建这个的唯一方法:

SQL> select value from nls_session_parameters
  2  where parameter = 'NLS_TIMESTAMP_FORMAT';

VALUE
--------------------------------------------------------------------------------
DD-MON-RR HH24.MI.SSXFF

SQL> select extract(hour from cast(to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')
  2  as timestamp)) from dual;

EXTRACT(HOURFROMCAST(TO_CHAR(SYSDATE,'DD-MON-YYYYHH24:MI:SS')ASTIMESTAMP))
--------------------------------------------------------------------------
                                                                        15

alter session set nls_timestamp_format = 'DD-MON-YYYY HH:MI:SS';

Session altered.

SQL> select extract(hour from cast(to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')
  2  as timestamp)) from dual;

select extract(hour from cast(to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') as timestamp)) from dual
                              *
ERROR at line 1:
ORA-01849: hour must be between 1 and 12
Run Code Online (Sandbox Code Playgroud)

因此,简单的"修复"是将格式设置为24小时识别的内容:

SQL> alter session set nls_timestamp_format = 'DD-MON-YYYY HH24:MI:SS';

Session altered.

SQL> select extract(hour from cast(to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS')
  2  as timestamp)) from dual;

EXTRACT(HOURFROMCAST(TO_CHAR(SYSDATE,'DD-MON-YYYYHH24:MI:SS')ASTIMESTAMP))
--------------------------------------------------------------------------
                                                                        15
Run Code Online (Sandbox Code Playgroud)

虽然你根本不需要to_char:

SQL> select extract(hour from cast(sysdate as timestamp)) from dual;

EXTRACT(HOURFROMCAST(SYSDATEASTIMESTAMP))
-----------------------------------------
                                       15
Run Code Online (Sandbox Code Playgroud)


Rob*_*ebe 7

select to_char(tran_datetime,'HH24') from test;

TO_CHAR(tran_datetime,'HH24')
------------------
16      
Run Code Online (Sandbox Code Playgroud)

  • 正是在寻找非常干净的解决方案 (2认同)