【问题标题】:How to validate date in DB2如何在 DB2 中验证日期
【发布时间】:2020-10-04 08:01:42
【问题描述】:

将 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 参考主题集合,以获取有关标量函数的更多信息。更正为函数指定的参数。再次尝试请求。

【问题讨论】:

  • 如果问题是关于如何验证日期的字符串表示,请使用带有异常处理程序的 UDF。否则请提供完整代码的示例。
  • 我已经发布了完整的查询。你能在这里帮忙吗
  • 你在你提到的 CASE 表达式之前漏掉了一个逗号。按原样运行以下语句。 SELECT S1.DT , CASE WHEN S1.DT != '0001-01-01' THEN S1.DT ELSE ' ' END as "SlDate" FROM (VALUES '0001-01-01', '0001-01-02') S1 (DT)你有什么错误吗?

标签: sql date validation datetime db2


【解决方案1】:

您的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)

【讨论】:

    【解决方案2】:

    不幸的是,您将列命名为 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"

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2018-05-21
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2018-08-31
      • 2010-09-27
      相关资源
      最近更新 更多