1

テーブルに文字列として日付を保存しています(列名は「log_event」です)-ええ、実際の日付型である必要があることはわかっています-しかし、作成していない既存のテーブルで作業しています。

とにかく、日付は次の形式で列に表示されます

'08/14/2014 午前 1:01' (または午後)

私は本当に、文字列の日付部分に基づいて SELECT を取得しようとしています (SELECT の目的で時間は気にしません。たとえば、date1 と date2 の間の日付を持つすべての行が必要です)。 、そして私は試しました:

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

しかし、私のSELECTはNULLを返します

(はい、これは 2 つの日付の間で SELECT しないことを知っています。次のレベルに進む前に、クエリ文字列を段階的に作成して、それが正しいことを確認しようとしています)

また、次のようにして、時間のフォーマットも試みました。

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y %l:%i %p') > STR_TO_DATE('08/01/2014 12:00 am', '%m/%d/%Y %l:%i %p')

これも NULL 選択を返します。

どこが間違っていますか?

4

2 に答える 2

0

これを試して:

 DATE(STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p'))

STR_TO_DATE()入力文字列全体を理解できない場合は NULL を返すため、すべてを解釈してから を使用DATE()して日付部分を取得することをお勧めします。

各テキスト タイムスタンプから日付部分を取得せずに、日付範囲の選択を行うこともできます。たとえば、これは昨日のエントリを取得します

 WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') >= DATE(NOW()) - INTERVAL 1 DAY
   AND STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') <  DATE(NOW())

ところで、NULL を返すというこの主張は、データをクリーニングするときに役立ちます。トラブルシューティングを行うときは、このようなコマンドを使用して、意味のない日付文字列を見つけることができます。

 SELECT whatever FROM table WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') IS NULL

「悪い」データが表示されます。

于 2014-09-29T16:01:25.973 に答える
0

あなたのコードは私のために働く...

sqlfiddle.comで次のスキーマを設定しました。

CREATE TABLE db_event_log (
    id INT(11) NOT NULL AUTO_INCREMENT,
    log_event VARCHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO db_event_log (log_event) 
VALUES ('07/14/2014 1:01 am'),
       ('08/14/2014 1:01 am'),
       ('09/14/2014 9:01 pm');  

...次に、クエリを実行しました:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

...返された:

ID  LOG_EVENT
2   08/14/2014 1:01 am
3   09/14/2014 9:01 pm

http://sqlfiddle.com/#!2/59da0/1

2 つの日付の結果の取得

2 つの日付の間の結果を取得するには、MySQL のBETWEEN演算子を使用できます。例えば:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') 
BETWEEN STR_TO_DATE('08/01/2014', '%m/%d/%Y') AND STR_TO_DATE('09/01/2014', '%m/%d/%Y')

http://sqlfiddle.com/#!2/cc7681/1

于 2014-09-29T16:29:51.300 に答える