MariaDB講座 / 日付の加算・差分・表示形式と期間条件を扱う
DATE_ADDは期間を加え、DATEDIFFとTIMESTAMPDIFFは異なる単位・引数順で差を計算します。DATE_FORMATは表示用文字列を返します。期間検索は開始以上・次の境界未満とすると、月全体の範囲を明確に表せます。
何の差を求めるか決める
一か月の有効期限、日付境界を越えた日数、経過した整数時間は別の質問です。計算には日付型を使い、地域依存の表示文字列への往復を避けます。shopcourseを選び、SELECT VERSION(), DATABASE(), @@SESSION.time_zone;で環境を確認します。固定日を使うため実行日に結果は依存しません。
保存型とタイムゾーンは日付型、月次売上への応用は集計の照合で確認できます。DATE_ADDはINTERVAL、DATEDIFFは第一日付から第二日付、TIMESTAMPDIFFは単位・開始・終了の順です。
一か月と30日を比較する
同じ開始日に二種類の期間を加えます。
SELECT DATE_ADD('2026-01-31',INTERVAL 1 MONTH);
SELECT DATE_ADD('2026-01-31',INTERVAL 30 DAY);
一か月後は2026-02-28、30日後は2026-03-02です。移動先に同じ日がなければ有効な月末へ調整されます。一か月を常に30日とせず、契約の月末規則に合うか確認します。
引数順と時刻部分の扱い
日をまたぐ二時間で比較します。
SELECT DATEDIFF('2026-02-02 01:00:00','2026-02-01 23:00:00'),
TIMESTAMPDIFF(HOUR,'2026-02-01 23:00:00','2026-02-02 01:00:00');
結果は日付差1と整数時間差2です。DATEDIFFは時刻部分を無視します。TIMESTAMPDIFFは残りの分秒が整数単位へ含まれない場合があります。引数を機械的に写すと符号を逆にし得ます。
夏時間を含む経過時間は、値が現地の時計表示か正規化された時点かで意味が変わります。DATETIME二値だけが地域の実経過時間を自動で表すわけではありません。
DATE_FORMATは出力用に使う
固定値を表示します。
SELECT DATE_FORMAT('2026-02-05 12:34:56','%Y-%m'),
DATE_FORMAT('2026-02-05 12:34:56','%Y-%m-%d %H:%i:%s');
2026-02と2026-02-05 12:34:56という文字列です。分は%i、月は%mで、保存した日付そのものは変えません。地域名を含む月表示などはセッションの言語設定に依存する場合があります。
月全体を半開区間で選ぶ
dates_21_labが存在しないことを確認し、shopcourse内で全体を実行します。
CREATE TABLE dates_21_lab (event_id INT PRIMARY KEY, occurred_at DATETIME NOT NULL) ENGINE=InnoDB; INSERT INTO dates_21_lab VALUES (1,'2026-02-01 00:00:00'),(2,'2026-02-28 23:59:59'),(3,'2026-03-01 00:00:00'); SELECT event_id FROM dates_21_lab WHERE occurred_at >= '2026-02-01' AND occurred_at < '2026-03-01' ORDER BY event_id;
ID1・2が該当し、3月1日00時のID3は除外されます。月末の23:59:59を固定するより、小数秒の精度が変わっても意図が保たれます。列への直接の範囲条件はインデックスを検討する際にも確認しやすい形です。
無効値を調べて再実習する
NULL結果や警告なら入力書式、月末、閏年とSQLモードを調べます。ゼロや不完全な日付が受け入れられたことだけで、有効な業務日付とはしません。欠損を現在日時へ置き換える場合も意味を先に決めます。
再実習では選択中のDB、定義、保存行を確認し、必要なものを保存した後、削除可能なこの記事の実習表だけを削除します。DROP TABLEは定義と行を消し、通常のROLLBACKでは戻せません。他の記事や実アプリケーションの表へ範囲を広げないでください。
DROP TABLE shopcourse.dates_21_lab;




