Oracle格式化日期而不将其转换为CHAR

x3naxklr  于 2023-03-22  发布在  Oracle
关注(0)|答案(2)|浏览(163)

我想在Oracle中格式化日期而不转换为char,例如to_char(date,'dd/mm/yyyy'),我尝试使用to_date

to_date(papf.start_date,'yyyy-mm-dd')

但是它并没有真正格式化任何东西,另外我想把格式设置为mm/dd/yyyy,我该怎么做呢?

ewm0tg9j

ewm0tg9j1#

DATE是一种二进制数据类型,由7 bytes组成,代表世纪,世纪年,月,日,小时,分钟和秒。它始终具有这7个组件,并且从不以任何特定的人类可读格式存储。
询问:
我想在Oracle中格式化日期而不转换为字符
这就像要求查看MP3文件的字节而不将其转换为声音或查看JPEG文件而不将字节解码为像素和颜色一样。
如果你想有一个特定格式的日期,那么你需要将其转换为非二进制格式,这将是一个字符串。
您可以:
1.使用TO_CHAR将日期显式转换为字符串:

SELECT TO_CHAR(papf.start_date,'yyyy-mm-dd')
FROM   your_table papf

1.允许您用于访问数据库的任何客户端应用程序在向您显示日期时将其隐式格式化为字符串。如果您使用的是SQL*Plus或SQL Developer,则它们将使用NLS_DATE_FORMAT会话参数作为默认格式模型,用于在日期和字符串之间进行隐式转换,您可以使用以下命令进行设置:

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd';

然后选择该值作为日期,并允许客户端设置其格式:

SELECT papf.start_date
FROM   your_table papf

如果您使用的是不同的客户端应用程序,那么您需要查看其文档并了解它如何格式化日期。
1.如果你真的不想把它作为一个字符串,那么你可以用途:

SELECT TO_NUMBER(TO_CHAR(papf.start_date, 'DDMMYYYY'))
FROM   your_table papf

SELECT 1000000 * EXTRACT(DAY   FROM papf.start_date)
       + 10000 * EXTRACT(MONTH FROM papf.start_date)
       +     1 * EXTRACT(YEAR  FROM papf.start_date)
FROM   your_table papf

这两种方法都将其显示为8位数(但不会以您想要的格式显示斜杠)。
我试着使用to_date:

to_date(papf.start_date,'yyyy-mm-dd')

但它并没有格式化任何东西
它不格式化任何东西,因为DATE是二进制数据类型,从不存储任何特定的(人类可读的)格式。
此外,它可能会导致日期问题,因为TO_DATE将字符串作为第一个参数,因此您实际上是在执行隐式日期到字符串的转换,然后将其转换回日期,因此查询实际上与以下内容相同:

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;

然后输出:
| 今日|今天与迄今为止|
| - ------|- ------|
| 2023-03-20 18:42:40|2019 -03-23 00:00:00|
fiddle
在本例中,使用TO_DATE交换了年和日,并将时间截回到午夜。

切勿在已经是日期的值上使用TO_DATE

xggvc2p6

xggvc2p62#

如果你不想指定文字日期格式(这实际上是推荐的做法),你可以为所有日期到字符串的转换设置默认值:

alter session set nls_date_format='mm/dd/yyyy';

select start_date from ...

然而,尽管这在sqlplus和任何其他将所有内容转换为字符串的客户端中都可以工作,但如果您的客户端实际上需要日期,则不会发生任何转换,并且您也不希望它发生转换。将日期作为实际日期而不是字符串使用,直到您最终将其显示给人类或报表。如果您正在使用某种数据库浏览或报表工具,请将其转换为字符串。它很可能有一个选项部分,您可以在其中自动设置默认的NLS日期格式。

相关问题