如何在DB2中验证日期



将DATE字段更改为DT以避免混淆使用完整查询编辑问题以获得更清晰的

SELECT
S1.NR AS "a",
S1.ZTV AS "b",
S1.RNR AS "c",
S1.TW AS "d",
S1.STV AS "e",
S1.RTV "f",
S1.DA AS "v",
CASE 
WHEN S1.ZTV = '115' THEN 'T_RR' 
ELSE ' ' 
END AS "DT",
' ' AS "SiT",
S1.S1JL AS "Ns",
S1.S1JM AS "Vs",
S1.S1JN AS "NSv",
S1.S1JO AS "VSf",
S1.S1JP AS "Vse",
S1.S1JQ AS "Vde",
S1.S1JR AS "Vds" 
CASE WHEN S1.DT != '0001-01-01' THEN S1.DT
ELSE ' '
END as "SlDate"
FROM
XXXX S1 
JOIN
YYYYY B 
ON S1.STW = B.BCD 
AND  (
CASE 
WHEN B1.BUSX != ' ' 
AND S1.S1TV = B1.BTX THEN 1 
WHEN S1.S1TV = B1.B2TX THEN 1
ELSE 0
END) =1

如何在DB2中验证日期。我有一个列值为"0001-01-01"的列我有一个条件,只有在有效的情况下才能显示日期。

CASE WHEN S1.DT != '0001-01-01' THEN S1.DT ELSE ' ' END

执行查询时出现以下错误。这里可能有什么问题?

执行查询时此条件失败。SQL状态:42815供应商代码:-171消息:[SQL0171]函数CASE的参数1无效。原因…..:指定的函数CASE的参数1的数据类型、长度或值无效。恢复…:有关标量函数的更多信息,请参阅IBM i信息中心数据库类别中的DB2 for IBM i SQL Reference主题集合。更正为函数指定的参数。请重试该请求。

您的dt列是date,字符串值' '而不是datecase表达式返回单个类型。因为一个返回路径是date,所以SQL的规则选择date而不是字符串。

有一个内置的函数可以将值转换为NULL,这就是我推荐的:

NULLIF(S1.DT, '0001-01-01')

DB2足够聪明,可以将'0001-01-01'转换为日期。但你也可以明确地说,常数是一个日期:

NULLIF(S1.DT, DATE '0001-01-01')

如果您真的想使用字符串作为坏值,那么您需要将转换为字符串。在这种情况下,case可能是最简单的解决方案:

(CASE WHEN S1.DT = DATE '0001-01-01'
THEN TO_CHAR(s1.DT, 'YYYY-MM-DD')
ELSE ' '
END)

很遗憾您将列命名为DATE,这是一个SQL保留字,因此可能会引起混淆。无论如何,我希望看到您的CASE语句如下所示,因为THEN子句和ELSE子句的结果都需要具有相同的数据类型,在本例中为DATE。因此,请使用CAST(NULL AS DATE(而不是"。另一方面,如果希望结果为CHAR或VARCHAR类型,则需要将日期强制转换为字符,例如使用to_CHAR(S1.date(,然后可以将ELSE部分保留为"。

CASE WHEN S1.DATE != '0001-01-01' THEN S1.DATE ELSE CAST(NULL AS DATE) END as "SlDate"

CASE WHEN S1.DATE != '0001-01-01' THEN TO_CHAR(S1.DATE, 'YYYY-MM-DD') ELSE '' END as "SlDate"

相关内容

  • 没有找到相关文章

最新更新