2012-11-22 12 views
19

私はグーグルと日付を比較するいくつかの方法を試しましたが、残念ながら期待通りの結果を得られませんでした。私は次のようにレコードの現在の状態を持っている: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' 。なにか提案を?前もって感謝します。

答えて

37

あなたの形式は基本的に開始するソート可能ものではありません - あなたは文字列、および文字列を比較している「28-10-2012」は、「2012年2月11日」より大きいです。

代わりに、日付を日付として比較し、出力のためにそれらをターゲットフォーマットに変換する必要があります。

これを試してみてください:

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

(入力が常にthe documentationごとに、年 - 月 - 値の形式でなければなりません。)starttimeDATETIMEフィールドであれば、あなたがしたい場合がありますことを

注意を繰り返しの変換を避けるためにクエリを変更することを検討してください。 (オプティマイザはうまくそれを避けるために十分にスマートかもしれないが、それは価値をチェックです。)

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

(で開始するd-m-Yとして日付をフォーマットする珍しいことに注意してください - 一般的にy-M-dを使う方が良いでしょう、しかし、上記のコードはあなたが質問したことを行います)。

+0

多くのおかげで、これはまさに私が探しているものです:)。 –

+1

@MahmoudGamal:あなたの編集は理にかなっていません。構文date '2012-11-02'' **を使用して日付リテラルを指定すると**有効です(実際は日付リテラルを指定するSQL標準です)。 http://sqlfiddle.com/#!2/d41d8/4020 –

+0

@JonSkeet:SQL標準リテラルを使用してdatetimeリテラルを指定することもできます: 'timestamp '2012-11-02 00:00:00' '("プレーン "文字列を使用する代わりに)。 –

1

02-11-2012の代わりに2012-11-02を使用して、date_format()は不要です

0

次の方法を使用します。

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 */ 

これは役に立ちます!