SQLステートメントで、TIMESTAMPとして保存された日付とYYYY-MM-DD形式の日付を比較するにはどうすればよいですか?
例:SELECT * FROM table WHERE timestamp = '2012-05-05'
このクエリは、指定された日のタイムスタンプを持つすべての行を返しますが、深夜のタイムスタンプを持つ行のみを返します。
ありがとう
DATE()
関数を使用して、タイムスタンプの日付部分を抽出できます。
SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'
ただし、タイムスタンプ列にインデックスがある場合、インデックスを利用できるため、これは高速になります。
SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
WHERE cast(timestamp as date) = '2012-05-05'
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00'
AND timestamp <= '2012-05-05 23:59:59'
一部で示唆されているように、DATE(timestamp)
を使用することにより、列に操作を適用しているため、インデックスの順序に依存できません。
ただし、BETWEEN
の使用は、ミリ秒を含める場合にのみ信頼できます。タイムスタンプの例BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
では、2012-05-05 23:59:59.001
と2012-05-05 23:59:59.999
の間のタイムスタンプを持つレコードを除外します。ただし、このメソッドでも、データ型の精度のためにいくつかの問題があります。時折、999ミリ秒が切り上げられます。
最善の方法は次のとおりです。
SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'
MYSQLの変換関数を使用します。
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
これは動作するはずです
クエリを実行するためにSQLパラメータを使用している場合、これは役に立ちます
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
つかいます
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
あなたの質問を読んだとき、「MySQL」というタグが見えるまで、あなたはOracle DBにいると思いました。とにかく、Oracleで作業する人にとっては、次の方法があります。
SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');