Oracle以外のSQLでSYSDATEを取得する方法
はじめに
業務ではOracleを使う事が多いんですが、たまにDB2も使ったりします。
そんな時に一番困るのが、各DBMSで微妙にSQLの記述が異なる事です。
最近はSQLiteも使っているんですが、OracleともDB2ともSQLの記述が異なる事があったりするので、さらに混乱しています。
SQLは一応DBの標準語だけど、結構方言も使われているよ、というのが今回のお話。
結論
Oracle
SELECT SYSDATE FROM DUAL;
DB2
SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1;
MySQL
SELECT CURRENT_DATE;
SQLite
SELECT CURRENT_DATE;
SQL Sever
SELECT CONVERT ( date, SYSDATETIME() );
経緯
SQLiteでシステム日付を取得しようとしたとき、実はどう書いたら良いのか知らない事に気づく。
ちなみにOracleの場合は、以下の通りとなる。(DUALはダミー表)
select sysdate from dual;
DB2の場合だと、以下の通りとなる。(SYSDUMMY1はダミー表)
select current date from sysibm.sysdummy1;
調べたところ、SQLiteでは「current_date」でシステム日付を取れるらしい。
(ちなみにDB2とはアンダースコアの有無が微妙に違う)
そこで以下の通りに実行したところ、エラーで怒られる!
sqlite> select current_date from dual;
Error: no such table: dual
「じゃあダミー表はどう書くんだよ!」とキレ気味に調べていると、
どうやらSQLiteではダミー表の指定は不要らしい。
今度は以下の通りに実行したところ、無事取得できました。めでたしめでたし。
sqlite> select date();
2015-06-07
まとめ
ちなみにSQL Serverには日付のみを返す関数は無いらしく、変換が必須のようです。
システム日付一つ取っても、これだけ記述が異なるわけですから、
複数のDBMSに対応したSQL逆引き辞典みたいなのがあると便利なんですけどね。
(現状ではこの本でしょうか。詳しく見てないのでわかりませんが。)