Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL的ISDATE()等价物_Mysql_Sql_Mysql Workbench - Fatal编程技术网

MySQL的ISDATE()等价物

MySQL的ISDATE()等价物,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我有一行SQL server代码,它将日期列为“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,

我有一行SQL server代码,它将日期列为“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中无效,我可以做些什么来解决这个问题?

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

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

您还可以使用以下命令

使用
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在这里可能很棘手,因为日期有太多不同的格式

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

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

WHERE DAYNAME(dt) IS NOT NULL
这些有效日期返回“星期二”:

SELECT IFNULL(DAYNAME('2016-06-21 18:17:47') , '');
SELECT IFNULL(DAYNAME('2016-06-21') , '');
这些无效日期返回“”(空字符串):

在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

我假设如果参数是date(而不是例如string),性能会更好。

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

我使用基准测试运行了所有三个示例,其中包括有效日期和无效日期。我在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方法似乎最快。但是没有一条路是真正糟糕的。

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

所有日期戳中都有“-”或“/”字符,所以为什么不使用LIKE参数检查所有有这些字符的日期列呢

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

错误代码可能重复:1582。调用本机函数“STR_to_DATE”时参数计数不正确是的,我忘记了格式参数。如果希望
dt
有日期,只需添加日期类型格式即可。我编辑了我的答案。现在它抛出以下错误代码:1054。“字段列表”中的未知列“dt”嗯,奇怪。我不认为它会这么做,除非有什么改变。错误消息听起来好像问题出在
select
子句中的
dt
,而不是
where
子句中;可能是由创建字段的子查询中的某些内容引起的。此外,这与手头的问答无关(我应该仍然有公认的答案,如果你不能解决问题,你应该发表一篇新的帖子)。但是尝试在第一个select和where中将表名附加到它
x.dt
,并确保在子查询中正确创建字段。祝你好运,如果你最后写了一篇新文章…请随意给我链接。这不会正确处理无效日期(例如2012-02-31)。我知道regexp是不可靠的。带
日期的后者呢?你是说两者都不起作用还是哪一个?这不是个好主意。如果您检查了一个字符串,该字符串中包含的
/
-
不是日期,会发生什么情况?因为如果日期无效,这会引发警告(“不正确的日期时间值”),这会导致插入和更新失败。是否有任何方法可以执行类似于插入tbl(我的日期)的操作,从源tbl选择IF(DAYNAME(dt)不为NULL,dt,'1900-01-01')?
SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%/%';
SELECT * FROM TABLE WHERE DATE_COLUMN LIKE '%-%';