bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. DynamoDBで日付を扱う場合の覚え書き

DynamoDBで日付を扱う場合の覚え書き

Jan 6, 2026 DynamoDB , AWS bucket-sort

DynamoDB で日付(日時)を扱うとき、「ISO 8601(ATOM形式)で保存するべき」という説明をよく見かけます。

ただ、少し整理してみると、DynamoDB が本質的に求めているものは“日時”そのものではなさそうです。

DynamoDB における本質

  • ATOM(ISO 8601)文字列である必要はない
  • ただし「文字列比較=日時の前後関係」になる形式である必要がある
  • DynamoDB が求めているのは “日時” ではなく “ソート可能なキー”

ここが設計上の重要ポイントだと理解しました。

なぜ「文字列比較」が重要なのか

DynamoDB の Sort Key(および GSI の Sort Key)は、型によって比較方法が異なります。

  • 数値なら数値比較
  • 文字列なら辞書順比較(lexicographical order)

例えば次のようなクエリを書く場合:

created_at BETWEEN :from AND :to

これが正しく動くには、

"from" <= created_at <= "to"

が文字列としても成立している必要があります。

つまり、

日時の前後関係 = 文字列の大小関係

になっていなければなりません。

見た目が日時であっても、この条件を満たしていない形式では Range Query が意図どおり動かない可能性があります。

文字列として安全な日時フォーマットの条件

文字列ソートで正しく比較させるためには、いくつか条件があります。

必須条件

  1. 年 → 月 → 日 → 時 → 分 → 秒 の順で並ぶ
  2. 各桁がゼロ埋めされた固定長
  3. タイムゾーンが揃っている(または UTC 固定)

この3点を満たしていれば、ISO 8601 でなくても問題は起きにくいと考えられます。

具体例

ATOM / ISO 8601(王道)

2025-09-27T14:23:45Z

スペース区切り(MySQL互換形式)

2025-09-27 14:23:45

どちらも

  • 年 → 月 → 日 → 時 → 分 → 秒 の順
  • ゼロ埋め固定長
  • 同一タイムゾーン

という条件を満たしているため、文字列比較でも正しく前後関係が保たれます。

ATOM(ISO 8601)が選ばれやすい理由

技術的に必須というより、設計上の安全性が高いことが理由のようです。

  • RFCで標準化されている
  • タイムゾーン情報を含められる
  • 多言語・多サービスで共通フォーマット
  • 将来、別システムにデータを渡しても壊れにくい

つまり、

技術的必須ではないが、設計的に安全

という位置づけで採用されることが多いと理解しています。

まとめ

DynamoDB で日時を扱う場合、重要なのは「ISO 8601かどうか」ではなく、

その値がソートキーとして正しく比較できるか

という点にあります。

DynamoDB が扱っているのは「日時」という概念ではなく、あくまで「キーの比較」です。

今後設計する際には、

  • 文字列で保存するか
  • 数値(UNIXタイム)で保存するか
  • GSI をどう設計するか

といった判断を、「日時形式」ではなく「比較可能性」を基準に考えていこうと思います。

DynamoDB AWS
← RDBMS経験者がDynamoDBを理解するための整理メモ LaravelでDynamoDBを使うには?モジュールを調べてみた →

Related Posts

  • 監査ログをDynamoDBに保存するlaravel-dynamodb-auditingパッケージの概要まとめ Mar 3, 2026
  • RDBのつもりでlaravel-dynamodbを使うとハマりそうなポイントを整理する Mar 1, 2026
  • Dockerを使ってDynamoDB LocalをWSL上のUbuntuで動かす Feb 28, 2026
  • LaravelでDynamoDBを使うには?モジュールを調べてみた Jan 7, 2026

Table of Contents

  • DynamoDB における本質
  • なぜ「文字列比較」が重要なのか
  • 文字列として安全な日時フォーマットの条件
    • 必須条件
  • 具体例
    • ATOM / ISO 8601(王道)
    • スペース区切り(MySQL互換形式)
  • ATOM(ISO 8601)が選ばれやすい理由
  • まとめ

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.