ISDATE()等效于MySQL

Joh*_*y B 6 mysql sql mysql-workbench

我有一行SQL服务器代码,其日期列为"YYYYMMDD",其中DD为00,并将00转换为01,以便它与datetime一起使用.我希望能够使用MySQL

适用于SQL Server的当前代码:

INSERT patentdb.Citation(PatentNo, Citation, CitedBy, CitationDate)
SELECT PatentNo, citation, WhoCitedThis, dt 
FROM 
(
  SELECT PatentNo, Citation, WhoCitedThis, dt = CASE
    WHEN CitationDate LIKE '%00' THEN INSERT (CitationDate, 8, 1, '1') 
    ELSE CitationDate 
  END 
  FROM patentdb.CitationSource
) AS x
WHERE ISDATE(dt) = 1;
Run Code Online (Sandbox Code Playgroud)

但isdate在MySQL中无效,我该怎么做才能解决这个问题?

Nic*_*ndo 9

您可以尝试使用STR_TO_DATE函数.null如果表达式不是日期,时间或日期时间,则返回.

WHERE STR_TO_DATE(dt, '%d,%m,%Y') IS NOT NULL
Run Code Online (Sandbox Code Playgroud)


Tim*_*nen 7

一种可能性,允许参数为字符串,整数或日期:

WHERE DAYNAME(dt) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

这些有效日期返回'星期二':

SELECT IFNULL(DAYNAME('2016-06-21 18:17:47') , '');
SELECT IFNULL(DAYNAME('2016-06-21') , '');
Run Code Online (Sandbox Code Playgroud)

这些无效日期返回''(空字符串):

SELECT IFNULL(DAYNAME('0000-00-00 00:00:00') , '');
SELECT IFNULL(DAYNAME('2016-06-32 18:17:47') , '');
SELECT IFNULL(DAYNAME(NULL) , '');
SELECT IFNULL(DAYNAME(10) , '');
Run Code Online (Sandbox Code Playgroud)

似乎DAYNAME在mysql 5.6中比STR_TO_DATE快2倍:

SELECT benchmark(10000000, DAYNAME('2016-06-21 18:17:47'))
1 row(s) returned   3.215 sec / 0.0000072 sec

SELECT benchmark(10000000, STR_TO_DATE('2016-06-21 18:17:47', '%d,%m,%Y'))
1 row(s) returned   7.905 sec / 0.0000081 sec
Run Code Online (Sandbox Code Playgroud)

我想如果参数是date(而不是eg.字符串),那么性能会更好.