動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石5: SQL Server datetime vs datetime2 —業務系JOIN事故の温床

出典: C# DateTime と DateTimeOffset の違い・タイムゾーン処理の正解(業務SE本番事故編)定石5: SQL Server datetime vs datetime2 —業務系JOIN事故の温床

定石5: SQL Server datetime vs datetime2 —業務系JOIN事故の温床 (csharp)#b11995d138a9
// ✅定石5-b: SQL Serverから読み出したDateTimeのKindはUnspecified
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("SELECT created_at FROM order_log WHERE id = @id", conn))
{
    conn.Open();
    cmd.Parameters.AddWithValue("@id", orderId);
    using (var reader = cmd.ExecuteReader())
    {
        if (reader.Read())
        {
            DateTime dt = reader.GetDateTime(0);
            Console.WriteLine($"Kind: {dt.Kind}");  // Unspecified
 
            // ❌ NG:そのままToUniversalTime()するとLocalとみなされる
            // ✅ OK: KindをUtcに固定してから扱う(DB側をUTCで保存している前提)
            DateTime utcDt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
            DateTime jstDt = utcDt.ToLocalTime();
        }
    }
}
▸ 実行ボタンで結果を表示
  • id: #b11995d138a9
  • lines: 20
  • extracted: 2026-06-10
  • captured: 2026-06-04

Source収録記事

この snippet は記事の「定石5: SQL Server datetime vs datetime2 —業務系JOIN事故の温床」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

6
図鑑トップ