如何在DD-MM-YY'中获取日期格式在不使用TO_CHAR的情况下在ORACLE中格式化?

时间:2018-03-29 10:49:26

标签: sql oracle

我们如何在' DD-MM-YY'中转换日期?格式没有使用to_char? 如果我使用以下查询,我会以DD-Mon-YY格式获取它?

select TO_DATE(SYSDATE,'DD-MM-YY') from dual ;

产出:29-Mar-18

我希望它采用29-03-18格式,不使用to_char 。 有可能吗?

3 个答案:

答案 0 :(得分:2)

ALTER SESSION是一个选项:

SQL> alter session set nls_date_format = 'dd-mm-yy';

Session altered.

SQL> select sysdate from dual;

SYSDATE
--------
29-03-18

请注意,您所做的 - 将TO_DATE函数应用于SYSDATE - 是错误的。 SYSDATE已经返回DATE,因此您可以对其应用TO_CHAR(使用适当的格式掩码),但不是TO_DATE。

答案 1 :(得分:2)

我建议你使用TO_CHARnls_date_format,但如果你想回答一个面试问题,EXTRACT是另一种选择。

SELECT EXTRACT (DAY FROM SYSDATE) 
       ||'-' 
       || LPAD(EXTRACT (MONTH FROM SYSDATE), 2, 0) 
       || '-' 
       || SUBSTR( EXTRACT(YEAR FROM SYSDATE),-2)  as dt
FROM   DUAL; 

答案 2 :(得分:2)

  

我们如何在' DD-MM-YY'中转换日期?格式没有使用to_char?

这是一种常见的误解,即数据库中的日期具有格式。

日期没有格式 - 它是stored internally to the database 7字节(代表年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL) /另外,SQL Developer,Java等)尝试将它显示给您,用户,并将其转换为您会发现有意义的事物(通常是字符串),日期被赋予格式,以便您(用户)找到它对客户端软件有意义。

所以你应该问的问题是:

  

我们如何获得<在此处插入SQL客户端软件的名称>更改它用于DATE数据类型的默认格式?

如果您使用的是SQL / Plus或SQL Developer,那么它将使用NLS_DATE_FORMAT会话参数来格式化日期。你可以change this using

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YY';

注意:这是一个会话参数,只会更改当前会话的格式(不适用于任何其他用户或任何后续会话)。

如果要将此设置为会话默认值,则可以设置logon trigger(如果用户依赖于以前的默认格式,则可能无法很好地应用此格式)。

您还可以将SQL Developer GUI中的首选项更改为described here

  

我们没有alter permission,它的客户端db

然后使用TO_CHAR( date, format_model ) - 这就是它的用途。

注意:请勿使用2位数年份作为预期格式。当日期被给予意外和错误的世纪时,这是一个错误的来源。

  

如果我使用以下查询,我会以DD-Mon-YY格式获取它?

select TO_DATE(SYSDATE,'DD-MM-YY') from dual ;

TO_DATE( date_string, format_model )接受两个字符串参数,Oracle将隐式调用TO_CHAR将您的日期转换为字符串,以便它与预期的数据类型匹配,然后当客户端程序对其进行格式化时,它将隐式执行类似的转变再次。所以你的查询是有效的:

SELECT TO_CHAR(
         TO_DATE(
           TO_CHAR(
             SYSDATE,
             ( SELECT VALUE
               FROM   NLS_SESSION_PARAMETERS
               WHERE  PARAMETER = 'NLS_DATE_FORMAT'
             )
           ),
           'DD-MM-YY'
         ),
         ( SELECT VALUE
           FROM   NLS_SESSION_PARAMETERS
           WHERE  PARAMETER = 'NLS_DATE_FORMAT'
         )
       )
FROM   DUAL;

如果NLS_DATE_FORMATMM-DD-YY,则SYSDATE将隐式转换为默认MM-DD-YY格式,然后使用您的格式DD-MM-YY明确转换为日期,并且在转换回默认MM-DD-YY格式以进行显示之前,将交换日/月值。依赖隐式转换很容易出现很多错误 - 尽量避免错误。

如果您希望SQL客户端的日期使用其默认格式进行格式化,则只需使用:

SELECT SYSDATE FROM DUAL;

如果您想获取格式化日期,请使用TO_CHAR( date, format_model )

SELECT TO_CHAR( SYSDATE, 'DD-MM-YY' ) FROM DUAL;