今更だが、初めて知った。
Oracle で、DB(データベース)サーバの持っている日時だけ取得する場合、
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') AS dt FROM DUAL;
とかすると、dt という項目に、例えば 2023/04/06 10:31:46 という値(現在日時)がセットされて返ってくる。
プログラマじゃない人に説明すると、SELECT 文は DB 上のテーブル(データが書き込まれている表)から値を取得する命令で、FROM のあとにテーブル名を指定する。
例えば、「個人情報」というテーブルに皆の名前や住所、年齢などが記録されているとして、その中から名前と年齢を取得しようとすると、
SELECT 名前, 年齢 FROM 個人情報
とすれば名前と年齢の一覧が取得できる。
しかし、上に書いたように、その DB サーバ自体が持っている日付(システム日付)を取得したいときなどは、なにかのテーブルにその値が記録されているというものではないので(「今何時?」って聞かれて、あなたは手帳を開いて今の時間を確認するかい?」ってことだね)、テーブル名を指定するわけにはいかない。でも、SELECT 文はテーブルを読む命令だから、なんかテーブルを指定してもらわないと・・・というのが Oracle の考えなわけで、仕方ないから「じゃあ、なんかダミーのテーブルを指定しますわ」ってものが DUAL なんですな。ダミーテーブルね。
で、さっき、SQL Server 触ってて、「DBサーバのシステム時間取りたいけど、ダミーテーブル名ってなんだっけ?」としばし悩んだのである。「DUAL」じゃ「オブジェクト名 'DUAL' が無効です。」って怒られるし。
そんで、ググったら、SQL Server にはダミーテーブルなんて概念ないので、From を省略すればいいだけと。
SELECT SYSDATETIME() AS dt
で、dt という項目に 2023-04-06 16:54:39.9673299 って値がセットされるって・・・
MySQL や PostgreSQL も一緒で、(ただし、SYSDATETIME という組み込み関数ではなく)
SELECT NOW() AS dt
のように指定する。
「そうなんかあ・・・初めて知った。SELECT 文に FROM がないのは気持ち悪いな」・・・と、Oracle 世代(DBと言えば Oracle だったおっさん世代)として素直に思ったが、さっき、PostgreSQL を DBMS とした自分の過去のプログラムを見たら、普通に「SELECT NOW() AS サーバ日時」とか書いてて、「初めて知ったわけではなく、完全に忘れていたのか」と加齢の恐ろしさに愕然としている(^^;;;