我有一行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中无效,我该怎么做才能解决这个问题?
答案 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 '%-%';