Saya biasanya memiliki "interseptor" yang sebelum membaca / menulis dari / ke database melakukan konversi DateTime (dari UTC ke waktu lokal, dan dari waktu lokal ke UTC), jadi saya dapat menggunakan DateTime.Now
(derivasi dan perbandingan) di seluruh sistem tanpa khawatir tentang zona waktu.
Mengenai serialisasi dan pemindahan data antar komputer, tidak perlu repot, karena datetime selalu UTC.
Haruskah saya terus menyimpan tanggal saya (SQL 2008 - datetime) dalam format UTC atau haruskah saya menyimpannya menggunakan DateTimeOffset
(SQL 2008 - datetimeoffset)?
Tanggal UTC di database (tipe datetime) telah bekerja dan dikenal begitu lama, mengapa mengubahnya? Apa kelebihannya?
Saya telah melihat artikel seperti ini , tetapi saya tidak 100% yakin. Ada pemikiran?
sumber
Jawaban:
Ada satu perbedaan besar, di mana Anda tidak dapat menggunakan UTC sendirian.
Jika Anda memiliki skenario seperti ini
Kemudian:
Tapi:
Contoh sederhananya adalah sistem reservasi tiket pesawat ... Tiket penerbangan harus berisi 2 kali: - waktu "lepas landas" (dalam zona waktu "Dari" kota) - waktu "mendarat" (dalam zona waktu kota "Tujuan")
sumber
InputLocationId
(atau entitas normal serupa). Akan ada perhitungan yang terlibat (halo, pengecualian ... terutama Anda, Indiana ), tetapi ini masih merupakan proses deterministik - dan keseimbangan logika waktu aplikasi sangat mudah.Anda sepenuhnya benar menggunakan UTC untuk semua waktu historis (yaitu peristiwa pencatatan terjadi). Selalu mungkin untuk beralih dari UTC ke waktu lokal tetapi tidak selalu sebaliknya.
Kapan menggunakan waktu setempat? Jawab pertanyaan ini:
Simpan waktu setempat hanya jika jawabannya "ya". Jelas itu hanya untuk tanggal yang akan datang, dan biasanya hanya untuk tanggal yang mempengaruhi orang dalam beberapa cara.
Mengapa menyimpan zona waktu / offset?
Pertama, jika Anda ingin mencatat apa offset untuk pengguna yang melakukan tindakan, Anda mungkin lebih baik melakukannya, yaitu saat login, catat lokasi dan zona waktu untuk pengguna tersebut.
Kedua, jika Anda ingin mengubah tampilan, Anda harus memiliki tabel semua transisi offset waktu lokal untuk zona waktu tersebut, cukup mengetahui offset saat ini tidak cukup, karena jika Anda menampilkan tanggal / waktu dari enam bulan yang lalu offset akan berbeda.
sumber
DATETIMEOFFSET memberi Anda kemampuan untuk menyimpan waktu lokal dan waktu UTC dalam satu bidang.
Hal ini memungkinkan pelaporan yang sangat sederhana dan efisien dalam waktu lokal atau UTC tanpa perlu memproses data untuk ditampilkan dengan cara apa pun.
Ini adalah dua persyaratan paling umum - waktu lokal untuk laporan lokal dan waktu UTC untuk laporan grup.
Waktu lokal disimpan di bagian DATETIME dari DATETIMEOFFSET dan OFFSET dari UTC disimpan di bagian OFFSET, sehingga konversinya sederhana dan, karena tidak memerlukan pengetahuan tentang zona waktu asal data, semua dapat dilakukan di tingkat database .
Jika Anda tidak memerlukan waktu turun ke milidetik, misalnya hanya untuk menit atau detik, Anda dapat menggunakan DATETIMEOFFSET (0). Bidang DATETIMEOFFSET kemudian hanya akan membutuhkan penyimpanan 8 byte - sama dengan DATETIME.
Oleh karena itu, menggunakan DATETIMEOFFSET daripada UTC DATETIME memberikan lebih banyak fleksibilitas, efisiensi, dan kesederhanaan untuk pelaporan.
sumber