如何将NUMERIC字段转换为DATE字段,并在DB2的WHERE子句中使用它?

dced5bon  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(154)

我有一个整数格式的字段20220801,需要将其转换为日期字段。然后,我需要在WHERE子句中使用该字段与CURRENT DATE进行比较。这是专门针对DB2的。
每次尝试执行此操作时,我都会收到以下错误消息:

下面是我尝试过的一些代码片段,但每次都失败,返回上述错误
第一个
我已经看了这里的许多答案,但没有一个让我通过这个错误。任何帮助导航将不胜感激!

6jjcrrmo

6jjcrrmo1#

看一下TIMESTAMP_FORMAT,它允许指定输入格式,然后返回一个TIMESTAMP或DATE。

VALUES (TIMESTAMP_FORMAT('20220801','YYYYMMDD'))
fafcakar

fafcakar2#

出现此问题的原因是某些行包含的数字无法使用指定模式格式化为时间戳。
请考虑以下示例,如果您取消注解任何已注解掉的行,则返回完全相同的错误。

SELECT
    DATE (TIMESTAMP_FORMAT (CHAR(BWDUED), 'YYYYMMDD')) AS DUE_DATE,
    CURRENT DATE AS TODAY_DATE
FROM
    (
    VALUES 
      --0 ,
      --20221232, 
      INT (TO_CHAR (CURRENT DATE, 'YYYYMMDD'))
    ) T (BWDUED)
WHERE
    DATE (TIMESTAMP_FORMAT (CHAR(BWDUED), 'YYYYMMDD')) = CURRENT_DATE

解决方案是创建一个“安全”的格式化程序函数,以避免可能的错误,并使用它来代替TIMESTAMP_FORMAT(或同义词TO_DATE函数)。

CREATE OR REPLACE FUNCTION TO_DATE_SAFE 
(
  P_STR VARCHAR (128)
, P_FMT VARCHAR (128)  
)
RETURNS TIMESTAMP
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC 
BEGIN 
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN 
    RETURN CAST (NULL AS TIMESTAMP);
  END;
  RETURN TO_DATE (P_STR, P_FMT);
END

相关问题