Oracle 将时间戳显示为军事时间

Oracle display timestamp as military time

我的一个表中有一个时间戳列。我正在执行以下操作,它显示为 12.00.00.100000 AM,但是当时间过去 12AM 时,它会按照我想要的方式显示在军用时间。

如何将日期显示为军事时间 12AM 时间 00:00:00.100000


  ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

SEQ_NUM    DT
1    01-JAN-22 12.00.00.000000 AM
2    01-JAN-22 12.05.00.100000 AM
3    01-JAN-22 12.10.00.200000 AM
4    01-JAN-22 12.15.00.300000 AM
5    01-JAN-22 12.20.00.400000 AM
6    01-JAN-22 12.25.00.500000 AM
7    01-JAN-22 12.30.00.600000 AM
8    01-JAN-22 12.35.00.700000 AM
9    01-JAN-22 12.40.00.800000 AM
10    01-JAN-22 12.45.00.900000 AM
11    01-JAN-22 12.50.00.000000 AM
12    01-JAN-22 12.55.00.100000 AM
13    01-JAN-22 01.00.00.200000 AM
14    01-JAN-22 01.05.00.300000 AM

如果您的数据类型是 TIMESTAMP 则使用:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

如果您的数据类型是 TIMESTAMP WITH TIME ZONE 则使用:

ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZR';

ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM';

但是,任何用户都可以随时更改自己的会话参数,因此如果您需要特定格式,那么最好从输出 TIMESTAMP 更改为输出包含给定格式值的字符串使用 TO_CHAR:

SELECT seq_num,
       TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS.FF') AS dt
FROM   table_name;

db<>fiddle here

您似乎有一个普通的 TIMESTAMP 列,而不是 TIMESTAMP WITH TIME ZONE 列。 (或者它可以是 TIMESTAMP WITH LOCAL TIME ZONE,如果您的会话设置为 UTC/GMT。)

您正在设置 NLS_TIMESTAMP_TZ_FORMAT,但这适用于 TIMESTAMP WITH TIME ZONE,而不是普通的 TIMESTAMP

如果您改为设置相关的 NLS 参数(没有 _TZ 部分):

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

然后你得到:

SEQ_NUM DT
1 2022-01-01 00:00:00.000000
2 2022-01-01 00:05:00.100000
3 2022-01-01 00:10:00.200000
4 2022-01-01 00:15:00.300000
5 2022-01-01 00:20:00.400000
6 2022-01-01 00:25:00.500000
7 2022-01-01 00:30:00.600000
8 2022-01-01 00:35:00.700000
9 2022-01-01 00:40:00.800000
10 2022-01-01 00:45:00.900000
11 2022-01-01 00:50:01.000000
12 2022-01-01 00:55:01.100000
13 2022-01-01 01:00:01.200000
14 2022-01-01 01:05:01.300000

db<>fiddle with plain TIMESTAMP, or with TIMESTAMP WITH LOCAL TIMEZONE,与会话时区为 GMT 时的输出相同。

或者您可以使用具有相同格式掩码的 to_char(),这样您就不会依赖于会话 NLS 设置。