ISDATE()等效于MySQL

时间:2012-12-04 18:43:29

标签: 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;

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

5 个答案:

答案 0 :(得分:9)

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

WHERE STR_TO_DATE(dt, '%d,%m,%Y') IS NOT NULL

答案 1 :(得分:5)

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

WHERE DAYNAME(dt) IS NOT NULL

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

SELECT IFNULL(DAYNAME('2016-06-21 18:17:47') , '');
SELECT IFNULL(DAYNAME('2016-06-21') , '');

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

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) , '');

似乎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

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

答案 2 :(得分:1)

与TimoKähkönen的回答类似,我使用TIMESTAMPDIFF确定日期是否有效,就像ISDATE一样。我在两个日期参数中使用相同的日期。如果是日期则返回零,否则返回NULL。

我使用有效和无效日期的BENCHMARK运行了所有三个示例。我在ISP JustHost,MYSQL版本5.6.32-78.1的共享服务器上运行它:

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

Mine:  Query took 3.5333 seconds.

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

Mine: Query took 7.9635 seconds.

SELECT benchmark(10000000, TIMESTAMPDIFF(DAY,'2016-06-21 18:17:47','2016-06-21 18:17:47'));

Mine:  Query took 5.1373 seconds.

...........................

With bad date (June 41st?)

SELECT benchmark(10000000, DAYNAME('2016-06-41 18:17:47'));

Mine: Query took 7.3872 seconds.

SELECT benchmark(10000000, STR_TO_DATE('2016-06-41 18:17:47', '%d,%m,%Y'));

Mine: Query took 7.9919 seconds.

SELECT benchmark(10000000, TIMESTAMPDIFF(DAY,'2016-06-41 18:17:47','2016-06-41 18:17:47'));

Mine:  Query took 7.3792 seconds.

STR_TO_DATE略慢于其他两个。如果您主要使用有效日期,则DAYNAME方法似乎最快。但没有一个是真正糟糕的方式。

答案 3 :(得分:0)

您还可以使用以下

使用REGEXP  '^([1-9]|0[1-9]|1[012])/([1-9]|0[1-9]|[12][0-9]|3[01])/(19|20)[0-9][0-9]'

但是regexp在这里可能很棘手,因为日期的格式太多了,

或者

Cast DATE然后检查结果的长度,找到null,然后找不到日期。 length(DATE(mydate))

答案 4 :(得分:-1)

好吧,尽管我欣赏所有声明,但我总是喜欢它的简单方法。

所有日期戳都带有“-”或“ /”字符,因此为什么不使用LIKE参数检查所有具有此类字符的日期列。

SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%/%';
SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%-%';