sql >> データベース >  >> RDS >> Mysql

Oracle-sqlおよびMysqlの共通の日付フォーマット関数

    まず、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)を参照 およびこちら(Oracle) 。



    1. c3p0プールは接続を確立できません。これをデバッグする方法は?

    2. UNION の代わりに JOIN を使用して A OR B の隣人を数える方法は?

    3. Knex.jsはSQLインジェクションを防ぎますか?

    4. postgresから特定のキーのjsonbのみを取得するにはどうすればよいですか?