まず、MySQLでは、暗黙的に変換される場合、日付は通常次の形式になります-2015-01-16
-20150116
ではなく 。 MySQLとの両方で次のことができると思います Oracle(標準SQL)-Oracle(10g)でチェックしましたが、機能しているようです。MySQLをいじっている
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
DATEに変換される文字列リテラルは、yyyy-mm-dd
の形式である必要があります。 。これで、日付が日付の場合に機能します 時間の部分はありません。これで、日付に時間部分がある場合、MySQLはDATE()
を使用するため、事態はさらに困難になります。 OracleはTRUNC()
を使用しますが、日付部分を取得する関数 。ただし、>=
を適切に使用することで、これを回避できます。 および<
例:
SELECT * FROM mytable
WHERE ( mydate >= DATE '2015-01-16' AND mydate < DATE '2015-01-17' )
OR ( mydate >= DATE '2015-01-18' AND mydate < DATE '2015-01-19' );
ここで、SYSDATE
を使用する場合 、最善の方法は、ANSI規格のCURRENT_DATE
を使用することです。 またはCURRENT_TIMESTAMP
。これらはフォーマットを必要とせずに直接比較でき、MySQLとOracleの両方で機能するはずです。 INTERVAL
を使用して日付演算を実行することもできます 、その場合、次のことを試すことができます:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
更新 私はこれについていくつか考えてきました。 今日入力されたすべての行を取得する場合、すぐ上のクエリは実際には機能しません。 。難しいのは、OracleがANSI日付リテラルを日付として(つまり、時間部分なしで)認識することですが、私が知る限り、日付/時刻> 値(OracleのDATE
は)日付 。とはいえ、OracleとMySQLの両方がEXTRACT()関数をサポートしているため、次のようにして今日を取得できるはずです。 の記録:
SELECT * FROM mytable
WHERE EXTRACT(YEAR FROM mydate) = EXTRACT(YEAR FROM CURRENT_DATE)
AND EXTRACT(MONTH FROM mydate) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(DAY FROM mydate) = EXTRACT(DAY FROM CURRENT_DATE);
特に、考慮すべき日付が複数ある場合は、明らかに扱いにくいです(IN
を使用しているため、これを行うと思います。 演算子)が、両方のプラットフォームで動作するはずです。 ここでSQLフィドルデモ(MySQL)を参照
および