【发布时间】:2020-06-05 15:16:55
【问题描述】:
查询是:
select substr(to_date('01-02-2018','mm-dd-yyyy'),4,3) from dual;
输出是:
JAN
谁能解释一下输出是怎么来的?
【问题讨论】:
-
你为什么不直接使用
substr('01-02-2018',4,3)并摆脱日期转换?
标签: sql date substring oracle10g
查询是:
select substr(to_date('01-02-2018','mm-dd-yyyy'),4,3) from dual;
输出是:
JAN
谁能解释一下输出是怎么来的?
【问题讨论】:
substr('01-02-2018',4,3) 并摆脱日期转换?
标签: sql date substring oracle10g
当您将文本函数直接应用于 DATE 数据类型的内容时,您会强制将日期隐式转换为字符串。此转换使用 NLS_DATE_FORMAT 参数来决定输出字符串的格式。
实际上,
substr(to_date('01-02-2018','mm-dd-yyyy'),4,3)
与
相同substr(to_char(to_date('01-02-2018','mm-dd-yyyy'), <NLS_DATE_FORMAT>),4,3)
NLS_DATE_FORMAT 参数的通常默认值(对于数据库的英语版本)是 DD-MON-RR - 听起来您的 NLS_DATE_FORMAT 参数的值设置为,这意味着您的查询正在执行:
substr(to_char(to_date('01-02-2018','mm-dd-yyyy'), 'DD-MON-RR'),4,3)
因此,substr 正在处理字符串 02-JAN-18,从第 4 个字符开始的 3 个字符是 JAN。
与其在约会中使用substr,不如使用to_char,例如:
to_char(to_date('01-02-2018', 'mm-dd-yyyy'), 'MON')
【讨论】:
NLS_DATE_FORMAT 依赖于NLS_TERRITORY,因此,对于世界上许多国家,您的概括“NLS_DATE_FORMAT 参数的通常默认值是DD-MON-RR”并不成立。