日本語

開発者ツール · Unix タイムスタンプ コンバータ

エポック整数とタイムスタンプ列: ユニットがスキーマに属する理由

· なぜそれが重要なのか

タイムスタンプ データベース データ形式

同じ瞬間をフィードする整数列と日付/時刻列
オリジナル ToolAcre ベクトル イラスト

時刻を整数エポックとして保存することは簡単で移植可能ですが、これは全員が単位とゾーンに同意する場合に限られます。この投稿では、整数とネイティブのタイムスタンプ タイプを比較検討し、どちらを選択する場合でも、単位を書き留める必要があると主張しています。

作成場所: 1700000000 または 1700000000000? — 2つのサービスが6か月間、異なる単位で執筆したコラム

1,738,578,000 と 1,738,578,000,000 の両方を含む `created_at` という列は一貫して解釈できません。数値的に並べ替えることで、年代順ではなく規模別にライターを分類し、すべてのリーダーの自動検出により、破損を修復するのではなく隠蔽します。スキーマは必要なユニットを保存できませんでした。

移行前に、プロデューサーごとに値をプロファイリングし、代表的な行を独立したイベントの証拠と比較します。すべての長い値を盲目的に分割しないでください。混合列には出所や慎重に限定された分類が必要です。 ToolAcre はサンプルの検査には役立ちますが、どのサービスが各行を書き込んだのかを推測することはできません。

大きさが混在すると、誰かが行を開く前にインデックスと保持クエリが歪む可能性もあります。検出を、1 つのクライアントの単なるフォーマット欠陥ではなく、データ整合性インシデントとして扱います。

整数エポックの場合 — 移植性、ソート、算術演算、およびデータベースのタイムゾーン設定からの独立性

整数エポックは交換がコンパクトで、原点、単位、幅が固定されている場合は比較が簡単です。ストレージ内のロケール形式のテキストを回避し、正規化後の期間の計算をサポートします。これらの利点は、INTEGER 自体からではなく、数値に関する契約から得られます。

このコントラクトが存在しない場合にコストが発生します。人間は値を直接読み取ることができず、汎用クライアントは大きな整数を丸める可能性があり、列の型は秒とミリ秒について何も示しません。ユニットサフィックスまたはスキーマの説明を追加し、境界でライターを検証します。

整数契約では、1 秒未満の入力の丸めも指定する必要があります。フロアリング、切り捨て、または丸めを行うと、縮尺が正しくても、境界イベントが異なる秒に割り当てられる可能性があります。

整数エポックは、周囲のスキーマによって決定されるトレードオフを伴う単純な数値交換を提供します。

データベース ネイティブのテンポラル型は、読み取り可能な日付操作を公開し、一部の無効な入力を拒否できますが、範囲、タイムゾーン セマンティクス、およびクライアント レンダリングはエンジンとタイプによって異なります。タイムスタンプ リポジトリにはデータベース アダプタが含まれていないため、これらの製品をランク付けしたり、ジェネリック型名からの「認識」を保証したりすることはできません。

選択したエンジンの現在のドキュメントを読み、ドライバーをテストします。一部のクライアントは、文字列、日付オブジェクト、またはゾーン調整された値を返す場合があります。ネイティブ型は、正確な型とセッションの動作が理解されている場合にのみ、特定の曖昧さを軽減します。これは、アプリケーション時間モデルに代わる普遍的なものではありません。

ネイティブのタイムスタンプの動作はデータベース固有であり、そのエンジンで検証する必要があります

ナロー符号付き整数とワイド整数の範囲は異なりますが、幅はスケールをエンコードしません。 BIGINT は、意味的に名前が付けられていないまま、安全に多くのミリ秒を保持できます。逆に、32 ビット秒フィールドは、その値が今日では普通に見えても、既知の境界に近づきます。

ワークブックのコメントが唯一の記録ですが、これは絶対的すぎます。名前、ドメイン タイプ、制約、生成されたスキーマ、および API 仕様はすべて、ユニットを保持できます。複数の強制可能なレイヤーを使用します。人間のコメントはレビュー担当者に役立ちますが、コードと検証は作成者が黙ってスケールを切り替えることを防ぎます。

フィールド幅と単位は独立したスキーマ決定です

既知の 2025 デプロイ中に作成された行に `1738578060000` が含まれているとします。ミリ秒にすると `2025-02-03T10:21:00.000Z` になります。秒としては通常の予想を超えており、消費者の範囲を超える可能性があります。隣接する行 `1738578060` は、秒として同じ瞬間にマップされます。

このペアは混合ユニットを示唆していますが、どのライターが責任を負っているのかは証明されていません。サービスのバージョンごとにグループ化し、パスまたは規模を取り込み、いくつかの既知のイベントを検証します。バックアップと移行ログを保存します。コンバータは監査レンズであり、一括書き換えエンジンではありません。

影響を受ける期間の複数の日付を監査します。 1 つの偶然の一致は誤解を招く可能性がありますが、一貫したプロデューサー固有のパターンは制御された移行ルールをサポートします。

作業例: 既知のレコードから疑わしいレガシー列のスケールを決定する

生のフィールドに `created_at_s` または `created_at_ms` という名前を付け、1 つのアダプターで解析し、単一の内部インスタント タイプを公開することで再発を防止します。 UTC インスタントを保存します。ユーザー側のエッジにのみローカル プレゼンテーションを適用します。テキストの API 値が望ましい場合は、明示的なオフセットまたは Z が必要です。

テストでは、すべてのシリアル化境界を越えて識別可能な値を送信する必要があります。両方のスケールが一致するため、ゼロは不十分なフィクスチャです。固定 ISO インスタントをアサートし、実際のドライバーを介してラウンドトリップします。これにより、2 つのサービスが 1 つの列に異なる方法で数か月間入力される前に、ユニットの損失が発生します。

移行中、古い行を修復する前に、選択した契約に違反する新しい書き込みを拒否します。そうしないと、混合データの作成を続けるアクティブなソースとクリーンアップが競合します。

これでカバーされないもの — FROM_UNIXTIME や to_timestamp などのデータベース固有の関数 (エンジンによって異なります)

この記事では、`FROM_UNIXTIME`、`to_timestamp`、または同等の関数については規定しません。これらの入力ユニット、範囲、およびゾーンのインタラクションは特定のエンジンおよびバージョンに属しており、いずれも ToolAcre 実装の一部ではありません。データベース間で関数名をコピーすると、レビュー中に非常に曖昧さが生じる可能性があります。

ベンダーのドキュメントと使い捨てテーブルを使用して、移行前に変換を証明します。アプリケーションとデータベースの変換の両方に同じオフセットや係数を適用しないようにします。単一の Well-owned 変換は、暗黙的なキャストのチェーンよりもテストが簡単です。

運用環境と同じセッション設定で境界フィクスチャに対してデータベース関数を実行します。セッションゾーンのデフォルトは、エポック演算が正しい場合でもテキストの結果を変更する可能性があります。

要点: スキーマはユニットが存在する場所であり、Unix タイムスタンプ コンバーターが適用されたユニットを示すことで既存データの監査にどのように役立つか

スキーマは、すべての書き手と読み手にとってタイムスタンプの表現を驚くべきものにしなければなりません。整数が適切な場合もあります。ネイティブのテンポラル列が適切な場合があります。名前のないスケールはそうではありません。 1 つの契約を選択して強制し、変換を明示的な境界操作として扱います。

従来のデータの場合、両方のユニットでサンプルを検査し、それらを既知のイベントと関連付けて、不確実性を記録します。 ToolAcre の目に見えるユニットの選択はその調査をサポートしますが、最終的な移行の決定は来歴とデータベースの実際のセマンティクスに基づいて行う必要があります。

スキーマのレビューは、ライター、リーダー、インデックス、保持ジョブが同じモデルを共有している場合にのみ完了します。列のコメントだけを修正すると、実行可能ファイルのあいまいさはそのまま残ります。