我们如何在' 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 。 有可能吗?
答案 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_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;
答案 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_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;