我想将时间戳字段转换为日期。它目前有以下格式:
Tms_field=2021年1月31日上午12.00.000000000
我希望它是:
2021年1月31日
我试过以下
select to_date(to_char(Tms_field,'dd-mon-yyyy')) from my_table
但它返回
2021年1月31日
我该怎么修?提前感谢
TIMESTAMP
列是一种二进制数据类型,由7到20个字节组成(世纪、世纪年、月、日、小时、分钟和秒各1个字节,小数秒最多6个字节,如果有任何时区信息,则最多7个字节(。它没有格式。
您看到的是客户端程序以用户会发现更有用的方式显示TIMESTAMP
,因此您需要更改此显示格式,或者通过将其转换为字符串将格式应用于TIMESTAMP
列。
因此,如果要以dd-mon-yyyy
格式显示TIMESTAMP
,请使用TO_CHAR
:
SELECT TO_CHAR( tms_field, 'dd-mon-yyyy' ) FROM my_table;
如果您想更改用户界面显示所有TIMESTAMP
值的方式,并且您正在使用SQL/Plus或SQL Developer,则可以使用:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'dd-mon-yyyy';
SELECT tms_field FROM my_table;
(注意:这不会影响数据库中的值,它纯粹用于用户界面中的格式化。(
*(注意2:你可能会发现你当前的NLS_TIMESTAMP_FORMAT
是DD-MON-RR HH12:MI:SS.FF9 AM
,这就是为什么它没有显示世纪。(
如果您使用的是不同的用户界面,则需要查看该UI的用户指南。
如果您想将TIMESTAMP
转换为DATE
,那么只需使用CAST
:
SELECT CAST( tms_field AS DATE ) FROM my_table;
然而,DATE
也是一种二进制格式,它总是包含世纪、世纪年、月、日、小时、分钟和秒组成部分,并且也有NOT格式。
它可能会在没有时间组件的情况下由您使用的用户界面显示,但它仍然会在后台。如果要更改所有DATE
值的显示方式,可以更改NLS_DATE_FORMAT
会话参数以更改SQL/Plus和SQL Developer的默认显示格式。