繁体   English   中英

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

[英]how to get the date format in 'DD-MM-YY' format in ORACLE without using TO_CHAR?

如何在使用to_char的情况下转换“ DD-MM-YY”格式的日期? 如果我使用以下查询,则以DD-Mon-YY格式获取它?

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

输出:18-Mar-18

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

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。

我建议您使用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; 

如何在不使用to_char的情况下转换“ DD-MM-YY”格式的日期?

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

日期没有格式-在内部以 7字节(代表年,月,日,小时,分钟和秒) 存储在数据库中,并且直到您使用的任何用户界面(例如SQL / Plus, SQL Developer,Java等)尝试将其显示给您(用户),并将其转换为您认为有意义的东西(通常是字符串),并指定日期的格式,以便您(用户)在客户端软件。

因此,您应该问的问题是:

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

如果您使用的是SQL / Plus或SQL Developer,则它将使用NLS_DATE_FORMAT会话参数来格式化日期。 您可以使用以下方法更改它

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

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

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

您还可以按此处所述在 SQL Developer GUI中更改首选项。

我们没有更改权限,其客户端数据库

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

注意:请不要使用两位数的年份作为预期格式。 当给日期一个出乎意料和错误的世纪时,这是错误的根源。

如果我使用以下查询,则以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-YYSYSDATE将隐式转换为默认的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM