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 设置。
我的一个表中有一个时间戳列。我正在执行以下操作,它显示为 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 设置。