SQLで日付を挿入するには、INSERT文の中で 'YYYY-MM-DD' 形式の文字列として記述するか、今日の日付であれば CURRENT_DATE などの関数を使います。例はPostgreSQL、MySQL、SQLite、SQL Serverで動作します。
SQLで日付を挿入する方法
日付を 'YYYY-MM-DD' 形式の文字列で記述します。カラムが日付型であれば、データベースが文字列を日付に変換します。
INSERT INTO table_name (date_column) VALUES ('YYYY-MM-DD');
INSERT INTO orders (order_id, customer, order_date)
VALUES (2, 'Tom', '2021-06-15');
TIMESTAMP や DATETIME カラムの場合は、スペースの後に24時間表記で時刻を追加します。
INSERT INTO flights (flight_no, departs_at)
VALUES ('UA 940', '2026-11-02 17:45:00');
-- In SQL Server, make departs_at a DATETIME2: its TIMESTAMP type isn't a date
今日の日付を入れるには、文字列の代わりに引用符なしで CURRENT_DATE を記述します。CURRENT_TIMESTAMP は日付と時刻を返します。
INSERT INTO orders (order_id, customer, order_date)
VALUES (3, 'Priya', CURRENT_DATE);
-- In SQL Server, use CAST(GETDATE() AS DATE): it has no CURRENT_DATE
-- Output (the new row, run on 2026-10-13):
-- order_id | customer | order_date
-- ---------+----------+-----------
-- 3 | Priya | 2026-10-13
知っておくべきルール
-
'YYYY-MM-DD'を使いましょう。それ以外の形式はデータベースの設定に依存します。PostgreSQLとSQL Serverは'06/15/2021'を月/日/年として解釈し、MySQLはエラーにします。
INSERT INTO orders (order_id, customer, order_date) VALUES (4, 'Ana', '06/15/2021');
-- MySQL: ERROR 1292 (22007): Incorrect date value: '06/15/2021' for column 'order_date' at row 1
-
SQLiteは日付をチェックしません。日付型がなく、渡されたテキストをそのまま保存します。日付関数は
'06/15/2021'を読み取れず、'2021-02-30'は2021-03-02に繰り越されます。 -
MySQLの
TIMESTAMPは1970年から2038年までしか扱えません。誕生日や過去の日付、遠い未来の日付にはDATETIMEを使います。
-- MySQL
CREATE TABLE people (name VARCHAR(50), born_at TIMESTAMP);
INSERT INTO people (name, born_at) VALUES ('Ada Lovelace', '1815-12-10 00:00:00');
-- ERROR 1292 (22007): Incorrect datetime value: '1815-12-10 00:00:00' for column 'born_at' at row 1
- 「現在」はデータベースのタイムゾーンになります(SQLiteでは常にUTC)。ユーザーが複数のタイムゾーンにいる場合は、UTCで保存しましょう。
別の構文
各データベース独自の「今日」と「現在」の関数もよく見かけます。
- MySQL:
CURDATE()とNOW()。PostgreSQLにもNOW()があります。 - SQLite:
date('now')とdatetime('now')。 - SQL Server:
CAST(GETDATE() AS DATE)とGETDATE()。CURRENT_DATEがないため、今日の日付にはキャストが必要です。
日付を挿入するのはどんなとき?
日付の挿入はほとんどが次の5つのケースのいずれかで、それぞれに適した方法があります。
既に分かっている日付を記録する
誕生日、期日、予約日などは人やフォームから入力されます。'YYYY-MM-DD' 形式の文字列で記述します。
今日の日付や現在時刻を記録する
注文日、登録日、監査ログは、誰かが入力した値ではなくデータベースの時計から取得すべきです。CURRENT_DATE または CURRENT_TIMESTAMP(SQL Serverでは GETDATE())を使うか、カラムのデフォルト値に設定します。
日付と一緒に時刻も保存する
会議、フライト、ログエントリには時刻も必要です。DATETIME または TIMESTAMP カラムを使い、'YYYY-MM-DD HH:MM:SS' と記述します。
別の日付から日付を計算する
期日、更新日、リマインダーは、別の日付から一定期間後になります。計算はデータベースに任せましょう。PostgreSQLとMySQLでは + INTERVAL、SQL Serverでは DATEADD()、SQLiteでは修飾子付きの date() を使います。
別の形式で書かれた日付を読み込む
スプレッドシートやCSVエクスポートには 06/15/2021 のような日付がよく含まれます。挿入時に変換しましょう。MySQLでは STR_TO_DATE()、PostgreSQLでは TO_DATE()、SQL Serverではスタイル番号付きの CONVERT() を使います。SQLiteは他の形式を解析できないため、substr() でテキストを並べ替えます。
日付挿入の実例
1つの文で複数の日付を追加する
祝日のリストは、1つのINSERTと日付ごとの値の行で登録できます。
INSERT INTO holidays (holiday_name, holiday_date)
VALUES
('Independence Day', '2026-07-04'),
('Thanksgiving', '2026-11-26'),
('Christmas Day', '2026-12-25');
デフォルト値で今日の日付を入れる
カラムにデフォルト値を設定すると、そのカラムを省略したINSERTには今日の日付が入ります。MySQLでは CURRENT_DATE を括弧で囲む必要があります。
CREATE TABLE orders (
order_id INT,
customer_id INT,
order_date DATE DEFAULT (CURRENT_DATE) -- SQL Server: DEFAULT CAST(GETDATE() AS DATE)
);
INSERT INTO orders (order_id, customer_id) VALUES (1, 42);
-- Output (the new row, run on 2026-10-13):
-- order_id | customer_id | order_date
-- ---------+-------------+-----------
-- 1 | 42 | 2026-10-13
ローカルの会議時刻をUTCで保存する
ニューヨークにいる人が現地時間の午前9:30に会議を予約したとします。挿入時にUTCに変換すれば、全員の時刻が揃います。
INSERT INTO meetings (title, starts_at_utc)
VALUES ('Design review', TIMESTAMP '2026-10-20 09:30:00' AT TIME ZONE 'America/New_York' AT TIME ZONE 'UTC');
-- MySQL (once its time zone tables are loaded):
-- CONVERT_TZ('2026-10-20 09:30:00', 'America/New_York', 'UTC')
-- SQL Server:
-- CAST('2026-10-20 09:30:00' AS DATETIME2) AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC'
-- Output (the new row):
-- title | starts_at_utc
-- --------------+--------------------
-- Design review | 2026-10-20 13:30:00
SQLiteには名前付きタイムゾーンがないため、挿入前にアプリケーション側で変換してください。
1か月後の更新日を設定する
サブスクリプションは開始から1か月後に更新されます。INSERTの中で更新日を計算しましょう。
INSERT INTO subscriptions (customer, started_on, renews_on)
VALUES ('Tom', '2026-10-13', DATE '2026-10-13' + INTERVAL '1' MONTH);
-- SQL Server: DATEADD(month, 1, '2026-10-13')
-- SQLite: date('2026-10-13', '+1 month')
-- Output (the new row):
-- customer | started_on | renews_on
-- ---------+------------+-----------
-- Tom | 2026-10-13 | 2026-11-13
SQLiteでは月末に注意してください。1月31日からだと3月にあふれてしまいますが、他のデータベースでは2月28日で止まります。
SELECT date('2026-01-31', '+1 month');
-- Output: 2026-03-03
日/月/年形式の日付をインポートする
仕入先から英国式の 15/06/2021 という日付の請求書が届いたとします。挿入時にデータベースへ形式を指定します。
INSERT INTO invoices (invoice_no, issued_on)
VALUES ('INV-1002', TO_DATE('15/06/2021', 'DD/MM/YYYY'));
-- MySQL: STR_TO_DATE('15/06/2021', '%d/%m/%Y')
-- SQL Server: CONVERT(date, '15/06/2021', 103), where style 103 is dd/mm/yyyy
-- SQLite can't parse dates: rearrange the text with substr()
-- Output (the new row):
-- invoice_no | issued_on
-- -----------+-----------
-- INV-1002 | 2021-06-15
日付の挿入に関する参考資料
このブログの記事:
- SQL日付フォーマットガイド:保存した日付を必要な形式で表示する
- SQL DATEDIFFガイド:2つの日付間の日数・月数・年数を数える
- SQL INSERT文:INSERT構文そのもの
- SQL CREATE TABLEガイド:日付カラム、デフォルト値、制約
-
PostgreSQLでの日付のフォーマット:PostgreSQLの日付型と
TO_CHAR - BULK INSERTでCSVデータをSQL Serverにインポートする:日付を含むエクスポートファイルの読み込み
公式ドキュメント:
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studioは、以前のSQLワークフローを完全に置き換えました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベースGUIを試しましたが、Beekeeperは機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」