私は日付(yyyy-mm-dd)、時(1-12)、分(00-59)、ampm/p)、およびタイムゾーン(pst/est)フィールドがあります。MySQL選択行<now()、区切られた時間フィールドを使用
< = now()の行を選択するにはどうすればよいですか? (つまり既に起こっています)
ありがとうございました!
編集:これは、時/分/ AP/TZフィールドに注意せずにそれをしない:
SELECT * FROM t.date WHERE date <= now()
私は日付(yyyy-mm-dd)、時(1-12)、分(00-59)、ampm/p)、およびタイムゾーン(pst/est)フィールドがあります。MySQL選択行<now()、区切られた時間フィールドを使用
< = now()の行を選択するにはどうすればよいですか? (つまり既に起こっています)
ありがとうございました!
編集:これは、時/分/ AP/TZフィールドに注意せずにそれをしない:
SELECT * FROM t.date WHERE date <= now()
ここでそれを行うための一つの方法だ - 日にすべてのあなたの秒、分、などを組み合わせて、と比較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]について
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日以上のイベントが過去になることがあります。
このテーブルのスキーマは制御できませんか? MySQLには、['datetime'](http://dev.mysql.com/doc/refman/5.0/en/datetime.html)の日付型があります。 –