2012-01-18 7 views
1

私は日付(yyyy-mm-dd)、時(1-12)、分(00-59)、ampm/p)、およびタイムゾーン(pst/est)フィールドがあります。MySQL選択行<now()、区切られた時間フィールドを使用

< = now()の行を選択するにはどうすればよいですか? (つまり既に起こっています)

ありがとうございました!

編集:これは、時/分/ AP/TZフィールドに注意せずにそれをしない:

SELECT * FROM t.date WHERE date <= now() 
+0

このテーブルのスキーマは制御できませんか? MySQLには、['datetime'](http://dev.mysql.com/doc/refman/5.0/en/datetime.html)の日付型があります。 –

答えて

0

ここでそれを行うための一つの方法だ - 日にすべてのあなたの秒、分、などを組み合わせて、と比較NOW()、同じタイムゾーンで比較を行うことを確認してください。 (未テスト):あなたの時間が01

SELECT * 
FROM t 
LEFT JOIN y ON t.constant=y.constant 
WHERE CONVERT_TZ(STR_TO_DATE(CONCAT(date,' ',hour,':',minute,' 'ampm), 
          '%Y-%m-%d %l:%i %p'), 
       timezone,"SYSTEM") < NOW(); 

場合 - 12 1-12その後、STR_TO_DATE%h代わりの%lを使用していません。

STR_TO_DATEは、日付と時刻の列をまとめて日付に変換しようとします。

CONVERT_TZ(...,timezone,"SYSTEM")は、この日付をtimezone列に指定されているタイムゾーンからシステム時刻に変換します。

これは、NOW()と常に比較されます。これは、常にシステム時刻です。

これ以外にも、おそらく1つの列をMySQLの日付データ型を使用してdateにする必要があります。算術演算が非常に簡単です。

参考のために、hereは非常に有用なmysqlの日付関数の要約です。ここでは、この回答の特徴を読み上げることができます。

幸運を祈る! date < = DATE_ [ADD | SUB]について

0
SELECT * FROM t 
WHERE `date`<=DATE_SUB(curdate(), INTERVAL 1 DAY) 
OR (
    `date`<=DATE_ADD(curdate(), INTERVAL 1 DAY) 
    AND 
    CONVERT_TZ(CAST(CONCAT(`date`,' ',IF(`hour`=12 AND ampm='a',0,if(ampm='a',`hour`,`hour`+12)),':',`minute`,':00') AS DATETIME),'GMT',`timezone`)<=NOW() 
) 

理由(CURDATE()、INTERVAL 1 DAY):

空想の変換は非常に高価な操作であるので、我々はそれを実行したくありません完全なテーブルに。このため、UNCHANGED dateフィールド(インデックスを使用している可能性があります)に対して事前に選択しています。時間帯がない場合、現在の時間帯の過去の1日以上が未来であり、時間帯がない場合、未来の時間帯の将来の1日以上のイベントが過去になることがあります。

関連する問題