読者です 読者をやめる 読者になる 読者になる

Oracle以外のSQLでSYSDATEを取得する方法

oracle sqlite mysql db2 sqlserver SQL

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

はじめに

業務では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 - playaの日記

 

そこで以下の通りに実行したところ、エラーで怒られる!

sqlite> select current_date from dual;
Error: no such table: dual

 

「じゃあダミー表はどう書くんだよ!」とキレ気味に調べていると、

どうやらSQLiteではダミー表の指定は不要らしい。

DUAL表 - Wikipedia

 

今度は以下の通りに実行したところ、無事取得できました。めでたしめでたし。

sqlite> select date();
2015-06-07

 

まとめ

ちなみにSQL Serverには日付のみを返す関数は無いらしく、変換が必須のようです。

SYSDATETIME (Transact-SQL)

 

システム日付一つ取っても、これだけ記述が異なるわけですから、

複数DBMSに対応したSQL逆引き辞典みたいなのがあると便利なんですけどね。

(現状ではこの本でしょうか。詳しく見てないのでわかりませんが。)

SQL逆引き大全363の極意