【问题标题】:COALESCE db2 dateCOALESCE db2 日期
【发布时间】:2015-08-28 10:09:45
【问题描述】:

我正在尝试查询 2 个不同的日期字段,并且一个日期字段 (datefield2) 具有空值。我的日期字段是 CCYYDDD,我通常按日期(数字(日期字段))将其转换为 mm/dd/yyyy 作为 NewDate。

这失败了

SELECT type, date(digits(datefield1)) AS DateEntered, coalesce(varchar(datefield2),'') as Renewed FROM MYDATA WHERE date(digits(datefeld1)) between '06/01/2015' and '6/30/2015' OR date(digits(coalesce(varchar(rendt7),''))) between '06/01/2015' and '06/30/2015'

以下成功

SELECT type, date(digits(datefield1)) AS DateEntered, coalesce(varchar(datefield2),'') as Renewed FROM MYDATA WHERE date(digits(datefeld1)) between '06/01/2015' and '6/30/2015' OR coalesce(varchar(rendt7),'') between '2015152' and '2015181

如何查询我的日期字段包含空值的位置?我计划为日期范围值传递参数,宁愿只传递 mm/dd/yyyy。

【问题讨论】:

  • 1) 不要在任何非明确整数计数上使用BETWEEN(根本)或任何其他包含上限(<=),因为您可能会得到错误的数据。从技术上讲,DATE 数据类型并没有真正的格式(仅用于显示),但如果您使用正确的主机变量类型,这不是问题。在您的列上调用 DATE(DIGITS(...)) 将使优化器忽略索引。但是,如果您将传入的主机变量转换为列类型,它可以使用索引(因为格式是可搜索的 - 尽管使用实际的日期类型更好)。

标签: sql db2


【解决方案1】:

我对你的问题有点困惑,但我认为你真正要找的是TIMESTAMP_FORMAT 函数。我认为会是这样的:

SELECT 
     type
    ,DATE(TIMESTAMP_FORMAT(datefield1,'YYYYDDD')) AS DateEntered
    ,DATE(COALESCE(TIMESTAMP_FORMAT(datefield2,'YYYYDDD'),'0001-01-01')) AS Renewed
FROM MYDATA
WHERE DATE(TIMESTAMP_FORMAT(COALESCE(datefield1, rendt7),'YYYYDDD'))
    BETWEEN @date1 AND @date2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2012-05-06
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多