11

我有一行代码用于 SQL 服务器,它采用列为“YYYYMMDD”的日期,其中 DD 为 00,并将 00 转换为 01,以便它与日期时间一起使用。我希望能够使用 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 中无效,我该怎么做才能解决这个问题?

4

5 回答 5

18

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

WHERE STR_TO_DATE(dt, '%d,%m,%Y') IS NOT NULL
于 2012-12-04T18:47:49.300 回答
17

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

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

在 mysql 5.6 中,DAYNAME 似乎比 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

我想如果参数是日期(而不是字符串),性能会更好。

于 2016-09-20T07:03:53.277 回答
1

与 Timo Kä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 方法似乎最快。但没有一个是真正糟糕的方式。

于 2018-06-14T19:04:24.070 回答
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]'

但是正则表达式在这里可能会很棘手,因为日期有太多不同的格式,

或者

投射日期,然后检查结果的长度,发现为空,然后不是日期。 length(DATE(mydate))

于 2012-12-04T18:58:28.497 回答
-1

好吧,虽然我很欣赏所有的陈述,但我总是喜欢简单的方法。

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

SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%/%';
SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%-%';
于 2020-05-08T19:49:00.913 回答