2017-07-25 8 views
1

私はcsvファイルからデータを取り出し、それをすべてテンポラリーテーブルに投げているので、すべてが文字列形式です。STR_TO_DATEはNULLの代わりにエラーを返します

したがって、日付フィールドも文字列形式であるため、日付を文字列から日付に変換する必要があります。すべての日付はこの形式です28/02/2013

私はこれにSTR_TO_DATEを使用しましたが、問題が発生しています。 ここに私のコードのスニペットがあります。

INSERT INTO `invoice` (`DueDate`) 
SELECT 
STR_TO_DATE('','%d/%m/%Y') 
FROM `upload_invoice` 

もちろんこれ以上のフィールドはありますが、私は機能しないフィールドに集中しています。 このコマンドを使用すると、日付が無効な場合はnullになりますが、nullが入力される代わりにエラーが生成されます。

#1411 - Incorrect datetime value: '' for function str_to_date 

エラーの意味を理解しています。これは、正しい形式の日付の代わりに空のフィールドを取得していることを意味しますが、ドキュメントを読んだ後でエラーを投げてはいけませんが、nullを挿入する必要があります。

ただし、INSERTを指定せずにSELECT文を使用した場合は正常に動作します。

私は実際にフィールドが空であればSTR_TO_DATEが実行されないポイント

IF(`DueDate`!='',STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate` 

に働く次の行を行うことができます。これはうまくいきますが、例えば日付がASDFADFASの場合など、有効でない日付をチェックすることはできません。

だから、私は

IF(TO_DAY(STR_TO_DATE(`DueDate`,'%d/%m/%Y') IS NOT NULL),STR_TO_DATE(`DueDate`,'%d/%m/%Y'),null) as `DueDate` 

を試みたが、これはまだif文で#1411エラーが発生します。

なぜ私の質問は、STR_TO_DATEが間違った日付にNULLを返さないのですか? #1411エラーが発生してはいけません。

これは他の質問と全く同じではありません。満足できる答えもなかった。私はこれをしばらくの間解決しました。私は解決策を追加しました。これは実際には他の投稿で与えられたより良い解決策です。

+0

[5.1.8サーバSQLモード:: MySQL 5.7のSQLモードの変更点](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-changes)を確認してください。 )。別のオプションは、[12.4 Control Flow Functions :: NULLIF()](https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions)を使用することです。html#function_nullif)。 – wchiquito

+0

'mysql> sql_notes = 0;を設定すると、mysqlに1411のようなワーニングが表示されなくなります。 – Amir

+0

私たちのサーバ上のmysqlの内部動作にアクセスする権限がありません。だから私はそれを行うことができるとは思わない –

答えて

0

あなたが試すことができますオプション:

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.19 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> DROP TABLE IF EXISTS `upload_invoice`, `invoice`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `invoice` (
    -> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> `DueDate` DATE 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `upload_invoice` (
    -> `DueDate` VARCHAR(10) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO `upload_invoice` 
    -> (`DueDate`) 
    -> VALUES 
    -> ('ASDFADFAS'), (NULL), (''), 
    -> ('28/02/2001'), ('30/02/2001'); 
Query OK, 5 rows affected (0.01 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO `invoice` 
    -> SELECT 
    -> NULL, 
    -> IF(`DueDate` REGEXP '[[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}' AND 
    ->  UNIX_TIMESTAMP(
    ->  STR_TO_DATE(`DueDate`, '%d/%m/%Y') 
    -> ) > 0, 
    -> STR_TO_DATE(`DueDate`, '%d/%m/%Y'), 
    -> NULL) 
    -> FROM `upload_invoice`; 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> SELECT `id`, `DueDate` 
    -> FROM `invoice`; 
+----+------------+ 
| id | DueDate | 
+----+------------+ 
| 1 | NULL  | 
| 2 | NULL  | 
| 3 | NULL  | 
| 4 | 2001-02-28 | 
| 5 | NULL  | 
+----+------------+ 
5 rows in set (0.00 sec) 

db-fiddleを参照してください。行が長いと混乱しているので、だから私はこの

protected function strDate($date){ 
    return "IF(`{$date}`!='',STR_TO_DATE(`{$date}`,'%d/%m/%Y'),null) as `{$date}`"; 
} 

INSERT INTO `invoice` (`DueDate`) 
SELECT 
{$this->strDate('DueDate')} 
FROM `upload_invoice` 

Iのような関数を作っ

+0

私は実際にこれをずっと前に解決しましたが、質問を投稿したことを忘れました。私は自分の答えを掲示します。 –

0

は、私はこの質問を投稿忘れてしまったが、私はこの

IF(`{$date}`!='',STR_TO_DATE(`{$date}`,'%d/%m/%Y'),null) as `{$date}` 

のようにしばらく前にこの問題を解決し本当にこの質問を投稿して忘れてしまった。それは永遠のように思えますが、これが私がどのように問題を解決したかです。

関連する問題