ISDATE 相当于 DB2

Posted

技术标签:

【中文标题】ISDATE 相当于 DB2【英文标题】:ISDATE equivalent of DB2 【发布时间】:2011-09-22 06:32:42 【问题描述】:

我有一个包含字符格式日期的表格。我想检查 date 的格式。请让我知道如何在 DB2 中做到这一点。我知道有一个函数 ISDATE 但它在 DB2 中不起作用。我在使用 db2 作为日期库的 AS400 上。请帮帮我

【问题讨论】:

由于 IsDate() 不是 SQL 函数,因此它不应该是 DB2 或任何 SQL DBMS 的一部分。它是 MS SQL Server 的 T-SQL 函数。 (Oracle 在 OLAP 中也有 ISDATE 程序。在 Sybase 等其他一些 DBMS 中可能也有类似的功能。) 要给出一个好的答案,我们应该看看你想如何使用它,尤其是对无效日期值的要求。 这里有一个 IS_DATE 用户定义函数,可以检查输入是否为有效日期***.com/questions/52297100/… 【参考方案1】:

实际上,用于 AS/400 的 DB2 可能没有ISDATE() 函数(我在 V6R1 参考中找不到任何东西 - 或者,有趣的是,LUW 参考中也找不到) .所以你的问题似乎是该函数不存在。

当然,问题的根源在于尝试翻译无效日期会导致语句停止。鉴于此,如果格式可行,此语句应为您提供日期,否则为 null。请注意,如果您混合了美国和欧元格式/排序,您可能 能够正确恢复数据(如果您的分隔符不同,我认为他们默认情况下,您可能会没事的)。

WITH date_format(strDate, format) as (
    SELECT strDate, 
        CASE 
            WHEN strDate LIKE('____-__-__') THEN 'ISO'
            WHEN strDate LIKE('__.__.____') THEN 'EUR'
            WHEN strDate LIKE('__/__/____') THEN 'USA'
            ELSE NULL END
    FROM dataTable
)
SELECT
    strDate, 
    format, 
    CASE 
        WHEN format IS NOT NULL THEN DATE(strDate)
        ELSE NULL 
    END AS realDate
FROM date_format

这会使 dataTable 看起来像这样:

String Dates
=============
2011-09-22   
22.09.2011   
09/22/2011   
a111x90x00  -- And who knows what this is...  

进入这个:

Results:
strDate      format   realDate
============================
2011-09-22   ISO      2011-09-22   
22.09.2011   EUR      2011-09-22   
09/22/2011   USA      2011-09-22   
a111x90x00   -        -            

这个例子当然是使用自动翻译的默认格式。如果您还有其他内容,则必须手动翻译它(而不是返回格式,您可以将其子串到 ISO 中,然后进行转换)。

【讨论】:

将此作为 UDF 将使其更易于在其他“字符日期”列上使用。 Clockwork-Muse 的答案无法用于验证日期。我已经对其进行了测试,当出现像“2016-02-30”或“2016-04-31”这样的无效日期时,它会产生错误。该逻辑仅检查格式,这不足以呈现给 CASE 语句以尝试 DATE() 转换。因此,您是否将上述内容视为答案取决于您是否希望筛选以特定方式格式化的数据,而不是尝试筛选任何无效日期(格式和值)。 另一个答案正在***.com/questions/37055675/…讨论【参考方案2】:

我不清楚“检查日期格式”的意图是什么,也不知道任何现有的 ISDATE() 会产生什么影响,但名称所暗示的内容似乎已经足够清楚了。考虑:

在 v5r3 上进行了极其轻微的测试 [即只是为了确保一些 bad date 字符串示例值和一些垃圾文本输入实际上返回 NULL 以及各种 standard 日期中的每一个具有有效值的格式返回日期值],以下应影响输入可变字符串的评估,最多 10 个字符作为可以转换为 DATE 的值;即当输入值不能转换为日期时,结果为 NULL。当然,这意味着初始 NULL 值不能直接与为无效日期字符串生成的结果区分开来。

如果需要一些所需的指标,例如 TRUEFALSE 作为结果,则可以在 CASE 表达式中编码用户定义函数 (UDF) 的使用;例如:CASE WHEN ISDATE(myVCcol) IS NULL THEN 'FALSE' ELSE 'TRUE' END

DROP   FUNCTION ISDATE                              
;                                                   
CREATE FUNCTION ISDATE                              
 ( InpDateStr VARCHAR( 10 )                         
 ) RETURNS DATE                                     
 LANGUAGE SQL                                       
 DETERMINISTIC                                      
 RETURNS NULL ON NULL INPUT                         
    SET OPTION DBGVIEW = *SOURCE , DATFMT = *ISO    
BEGIN                                               
 DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL ;
 RETURN DATE( InpDateStr ) ;                        
END                                                 
;                                                   

【讨论】:

以上是关于ISDATE 相当于 DB2的主要内容,如果未能解决你的问题,请参考以下文章

Redshift中的Isdate函数

PLS-00201:必须声明标识符“ISDATE”

它是啥样的 SQL? TODATE()、TOCHAR()、isdate 格式()

索引视图中的 SQL Server ISDATE

sql psql的isdate函数

怎么去判断返回的数据类型是时间类型呢?