如何在 DB2 中验证日期
How to validate date in 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 参考主题集合。更正为函数指定的参数。重试该请求。
很遗憾,您将列命名为 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"
您的 dt
列是 date
,字符串值 ' '
是 而不是 date
。 case
表达式 return 是一种类型。因为一个 return 路径是 date
,SQL 的规则在字符串上选择 date
。
有一个built-in函数可以把值转成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 字段更改为 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 参考主题集合。更正为函数指定的参数。重试该请求。
很遗憾,您将列命名为 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"
您的 dt
列是 date
,字符串值 ' '
是 而不是 date
。 case
表达式 return 是一种类型。因为一个 return 路径是 date
,SQL 的规则在字符串上选择 date
。
有一个built-in函数可以把值转成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)