to_date(
TO_CHAR(
papf.start_date,
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
),
'yyyy-mm-dd'
)
因此,如果您这样做:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-RR';
SELECT TO_CHAR(
SYSDATE,
'yyyy-mm-dd hh24:mi:ss'
) AS today,
TO_CHAR(
to_date(SYSDATE,'yyyy-mm-dd'),
'yyyy-mm-dd hh24:mi:ss'
) AS today_with_to_date
FROM DUAL;
2条答案
按热度按时间ewm0tg9j1#
DATE
是一种二进制数据类型,由7 bytes组成,代表世纪,世纪年,月,日,小时,分钟和秒。它始终具有这7个组件,并且从不以任何特定的人类可读格式存储。询问:
我想在Oracle中格式化日期而不转换为字符
这就像要求查看MP3文件的字节而不将其转换为声音或查看JPEG文件而不将字节解码为像素和颜色一样。
如果你想有一个特定格式的日期,那么你需要将其转换为非二进制格式,这将是一个字符串。
您可以:
1.使用
TO_CHAR
将日期显式转换为字符串:1.允许您用于访问数据库的任何客户端应用程序在向您显示日期时将其隐式格式化为字符串。如果您使用的是SQL*Plus或SQL Developer,则它们将使用
NLS_DATE_FORMAT
会话参数作为默认格式模型,用于在日期和字符串之间进行隐式转换,您可以使用以下命令进行设置:然后选择该值作为日期,并允许客户端设置其格式:
如果您使用的是不同的客户端应用程序,那么您需要查看其文档并了解它如何格式化日期。
1.如果你真的不想把它作为一个字符串,那么你可以用途:
或
这两种方法都将其显示为8位数(但不会以您想要的格式显示斜杠)。
我试着使用to_date:
但它并没有格式化任何东西
它不格式化任何东西,因为
DATE
是二进制数据类型,从不存储任何特定的(人类可读的)格式。此外,它可能会导致日期问题,因为
TO_DATE
将字符串作为第一个参数,因此您实际上是在执行隐式日期到字符串的转换,然后将其转换回日期,因此查询实际上与以下内容相同:因此,如果您这样做:
然后输出:
| 今日|今天与迄今为止|
| - ------|- ------|
| 2023-03-20 18:42:40|2019 -03-23 00:00:00|
fiddle
在本例中,使用
TO_DATE
交换了年和日,并将时间截回到午夜。切勿在已经是日期的值上使用
TO_DATE
。xggvc2p62#
如果你不想指定文字日期格式(这实际上是推荐的做法),你可以为所有日期到字符串的转换设置默认值:
然而,尽管这在sqlplus和任何其他将所有内容转换为字符串的客户端中都可以工作,但如果您的客户端实际上需要日期,则不会发生任何转换,并且您也不希望它发生转换。将日期作为实际日期而不是字符串使用,直到您最终将其显示给人类或报表。如果您正在使用某种数据库浏览或报表工具,请将其转换为字符串。它很可能有一个选项部分,您可以在其中自动设置默认的NLS日期格式。