[英]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_CHAR
或nls_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_FORMAT
为MM-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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.