【问题标题】:how to use substr function with to_date in sql?如何在sql中使用带有to_date的substr函数?
【发布时间】: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


【解决方案1】:

当您将文本函数直接应用于 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')

【讨论】:

  • default NLS_DATE_FORMAT 依赖于NLS_TERRITORY,因此,对于世界上许多国家,您的概括“NLS_DATE_FORMAT 参数的通常默认值是DD-MON-RR”并不成立。
  • 我已经澄清了。
猜你喜欢
  • 2014-11-08
  • 2012-12-15
  • 2011-10-28
  • 2012-12-28
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多