17

私は以下のようなものを持っています-

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

tran_datetimeDATEタイプです。これにより、一部の行でエラーが発生するため、形式(または軍事時間)HOUR must be between 1 and 12で Hour を処理できないことを理解しています。24 Hour以下は(明らかに)動作します-

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

また

EXTRACT(HOUR from CAST(tran_datetime AS TIMESTAMP))  --12 Hr format by default

を 24 時間形式でEXTRACT()取得する方法はありますか。つまり、午後 3 時は 15、午後 1 時は 13 などです。HOUR

注意してください-to_char(tran_datetime,'HH24')は非常に明白なオプションですが、EXTRACT()関数を具体的に使用することを検討しています。

4

3 に答える 3

24

問題は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

したがって、単純な「修正」は、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

まったく必要ありませんがto_char

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

EXTRACT(HOURFROMCAST(SYSDATEASTIMESTAMP))
-----------------------------------------
                                       15
于 2012-10-16T15:04:00.597 に答える
14
select to_char(tran_datetime,'HH24') from test;

TO_CHAR(tran_datetime,'HH24')
------------------
16      
于 2012-10-16T14:42:23.907 に答える