SQL20448N "05/09/2016" 不能使用 TIMESTAMP_FORMAT 函数的格式字符串 "YYYY-MM-DD" 解释

4 db2-9.7

执行 sql 查询时,我在 db2 中遇到以下错误-

SQL20448N "05/09/2016" 不能使用 TIMESTAMP_FORMAT 函数的格式字符串 "YYYY-MM-DD" 来解释。

这是我的 sql qyery-

SELECT DLR_CD,
       FIN ,
       YEAR(TO_DATE(CURRENT_DATE ,'YYYY-MM-DD'))-YEAR(TO_DATE(CRTNG_DTE,'YYYY-MM-DD'))
       AS AGE 
FROM ASPECT.RO_CAR_PARK_EXTRACT WHERE YEAR = PARM_YEAR
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?

数据库-DB2 v9.7.200.358 平台-家庭基础7

ype*_*eᵀᴹ 5

错误信息非常清楚。我想类型CRTNG_DTE是 text/varchar 并且至少其中一个值不是YYYY-MM-DD格式(05/09/2016显然不是!)并且转换TO_DATE(CRTNG_DTE, 'YYYY-MM-DD')失败。

消息中唯一不清楚的是提到了TIMESTAMP_FORMAT()功能。DB2 文档的TO_DATE()这部分功能明确指出:

TO_DATE标量函数是一个同义词TIMESTAMP_FORMAT标量函数。

混淆可能源于对TO_DATE()函数功能的错误假设。

TO_DATE(CRTNG_DTE, 'YYYY-MM-DD')试图将字符串具有格式YYYY-MM-DD 为日期。日期内部格式无关紧要,您无法修改它。您无法选择日期在内部保存的格式。

它们的内部格式是不同 DBMS 到 DBMS 的日期表示,也可能因版本而异。开发人员不需要关心这种表示是什么!


另一个问题是第一次转换:

YEAR(TO_DATE(CURRENT_DATE, 'YYYY-MM-DD'))
Run Code Online (Sandbox Code Playgroud)

由于TO_DATE()期望一个字符串(要转换)和一个格式字符串,但您将日期和格式字符串传递给函数,因此 DB2 首先将日期值 ( CURRENT_DATE) 转换为字符串(我猜使用安装输出格式中的默认值)MM/DD/YYYY) 所以它然后尝试计算:

TO_DATE('05/09/2016', 'YYYY-MM-DD')
Run Code Online (Sandbox Code Playgroud)

由于与上述相同的原因,这当然失败了。


因此,要解决问题(或问题):

  • 使用YEAR(CURRENT_DATE),而不是第一个计算。
  • 确保CRTNG_DTE列的所有值都以'YYYY-MM-DD'您期望的格式 ( )保存。