web-dev-qa-db-ja.com

date_formatとmysqlの日付の比較

私はグーグルで日付を比較するいくつかの方法を試しましたが、残念ながら期待どおりの結果が得られませんでした。私は次のような記録の現在の状態を持っています:

        mysql> select date_format(date(starttime),'%d-%m-%Y') from data;

              +-----------------------------------------+
              | date_format(date(starttime),'%d-%m-%Y') |
              +-----------------------------------------+
              | 28-10-2012                              |
              | 02-11-2012                              |
              | 02-11-2012                              |
              | 02-11-2012                              |
              | 03-11-2012                              |
              | 03-11-2012                              |
              | 07-11-2012                              |
              | 07-11-2012                              |

日付を比較したいので、次のようにします:

        mysql> select date_format(date(starttime),'%d-%m-%Y') from data where date_format(date(starttime),'%d-%m-%y') >= '02-11-2012';
               +-----------------------------------------+
               | date_format(date(starttime),'%d-%m-%Y') |
               +-----------------------------------------+
               | 28-10-2012                              |
               | 02-11-2012                              |
               | 02-11-2012                              |
               | 02-11-2012                              |
               | 03-11-2012                              |
               | 03-11-2012                              |
               | 07-11-2012                              |
               | 07-11-2012                              |

結果には「28-10-2012」を含めるべきではないと考えています。なにか提案を?前もって感謝します。

20

あなたのフォーマットは根本的にソート可能なものではありません-あなたはstringsと文字列「28-10-2012」is「02-11-2012」より大きい。

代わりに、日付を日付として比較し、出力用のターゲット形式にのみ変換する必要があります。

これを試して:

select date_format(date(starttime),'%d-%m-%Y') from data
where date(starttime) >= date '2012-11-02';

(入力は、 ドキュメント のように、年月値形式である必要があります。)

starttimeDATETIMEフィールドである場合、クエリの変更を検討して、変換が繰り返されないようにすることができます。 (オプティマイザーはそれを避けるのに十分賢いかもしれませんが、チェックする価値があります。)

select date_format(date(starttime),'%d-%m-%Y') from data
where starttime >= '2012-11-02 00:00:00';

(日付をd-m-Yとしてフォーマットすることは珍しいことに注意してください-ISO-8601標準などであるy-M-dを一般的に使用することをお勧めします。しかし、上記のコードはあなたが尋ねたことを行います質問で。)

39
Jon Skeet

02-11-2012の代わりに2012-11-02を使用すると、date_format()はもう必要ありません

2
wormhit

次の方法を使用します。

public function dateDiff ($date1, $date2) {
/* Return the number of days between the two dates: */
  return round(abs(strtotime($date1)-strtotime($date2))/86400);
}  
/* end function dateDiff */

それが役立ちます!

0
Gaurav Gupta