11

DDが00である「YYYYMMDD」としてリストされた日付を取得し、datetimeで機能するように00を01に変換するSQLサーバーのコード行があります。そのためにMySQLを使用できるようにしたい

SQL サーバーで動作する現在のコード:

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

引数を文字列、整数、または日付にすることができる1つの可能性:

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 は STR_TO_DATE よりも mysql 5.6 で 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 の回答と同様に、ISDATE のように日付が有効かどうかを判断するために TIMESTAMPDIFF を使用しました。両方の日付パラメーターで同じ日付を使用しています。日付の場合はゼロを返し、そうでない場合は NULL を返します。

有効な日付と無効な日付を指定して、3 つの例すべてを 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 は、他の 2 つよりもわずかに遅くなります。ほとんどの場合、有効な日付で作業している場合は、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]'

ただし、日付にはさまざまな形式が多すぎるため、ここでは正規表現は扱いにくい場合があります。

または

DATE をキャストしてから結果の長さをチェックし、null が見つかった後、日付ではありません。 length(DATE(mydate))

于 2012-12-04T18:58:28.497 に答える