0

尝试使用 Oracle SQL 从日期时间字段中删除毫秒和下午/上午。

我的查询是:

select created_dt from mydatabase

输出是:

09-NOV-21 12.18.40.490000000 PM

我尝试使用to_char(created_dt, 'dd-mm-yy hh24:mi:ss')然后使用to_timestamp转换回日期时间类型,但毫秒再次显示。

4

2 回答 2

1

数据类型以二进制数据类型的TIMESTAMP形式存储在表中,世纪、世纪、月、日、小时、分钟和秒各有 1 个字节,小数秒最多有 6 个字节。它永远不会以任何特定格式存储。

如果要更改时间戳中的小数位数,则需要使用CAST

SELECT CAST(created_dt AS TIMESTAMP(0))
FROM   mydatabase

但是,您可以将其转换为 a DATE(它也有按年计算的组件,但没有小数秒):

SELECT CAST(created_dt AS DATE)
FROM   mydatabase

完成此操作后,您使用的任何客户端应用程序(SQL/Plus、SQL Developer、Java、C#、PHP 等)仍将使用其默认规则来显示TIMESTAMP(或DATE),并且这些规则可能会显示一定数量的小数秒。

如果您使用的是 SQL/Plus 或 SQL Developer(但如果您使用的是 Java、C#、PHP 等),则默认格式由NLS_TIMESTAMP_FORMATsession 参数控制。

您可以使用以下方法更改它:

-- Display with precision of the data type
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
-- Display with 6-digits precision
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF6';
-- Display with no fractional seconds.
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

但是,如果您想要一种一致的格式化 a 的方法,请TIMESTAMP使用TO_CHAR.

于 2021-11-12T17:00:27.550 回答
0

无法更改 DATE 或 TIMESTAMP 数据类型的存储方式。

但是您可以更改查询默认为会话输出 TIMESTAMP 的方式。

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

例子:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MON-DD HH24:MI:SS';

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
select ts
, CAST(ts AS DATE) dt
, CAST(ts AS TIMESTAMP WITH TIME ZONE) AS tstz
from
(
  select 
   to_timestamp('2021-11-30 23:30:45.123456789', 'YYYY-MM-DD HH24:MI:SS.FF') AS ts     
  from dual
) q
TS | DT | 三峡工程                            
:----------------- | :-------------------- | :--------------------------------
2021-11-30 23:30:45 | 2021-11-30 23:30:45 | 21 年 11 月 30 日 23.30.45.123457 +00:00

db<>在这里摆弄

于 2021-11-12T17:00:12.453 回答