Hampir semua Jawaban dan Komentar berat di Pro dan ringan di Kontra. Berikut adalah ringkasan dari semua Pro dan Kontra sejauh ini ditambah beberapa Kontra penting (dalam # 2 di bawah) Saya hanya pernah melihat disebutkan sekali atau tidak sama sekali.
- PROS:
1.1. Lebih banyak ISO yang sesuai (ISO 8601) (walaupun saya tidak tahu bagaimana hal ini bisa dilakukan dalam praktiknya).
1.2. Lebih banyak rentang (1/1/0001 hingga 12/31/9999 vs. 1/1 / 1753-12 / 31/9999) (meskipun rentang ekstra, semua sebelum tahun 1753, kemungkinan tidak akan digunakan kecuali untuk mantan, dalam aplikasi historis, astronomi, geologi, dll.).
1.3. Persis cocok dengan rentang rentang .NET's DateTimeType (meskipun keduanya mengkonversi bolak-balik tanpa pengkodean khusus jika nilai-nilai berada dalam kisaran dan ketepatan jenis target kecuali untuk Con # 2.1 di bawah yang lain kesalahan / pembulatan akan terjadi).
1.4. Lebih presisi (100 nanosecond alias 0,000,000,1 dtk vs 3,33 milisecond alias 0,003,33 dtk) (walaupun presisi ekstra kemungkinan tidak akan digunakan kecuali untuk mantan, dalam rekayasa / aplikasi ilmiah).
1.5. Ketika dikonfigurasi untuk serupa (seperti dalam 1 milidetik tidak "sama" (seperti dalam 3,33 milidetik) seperti yang diklaim Iman Abidi) presisi DateTime, menggunakan lebih sedikit ruang (7 vs 8 byte), tetapi tentu saja, Anda akan kehilangan manfaat presisi yang kemungkinan merupakan salah satu dari dua (kisaran lainnya) yang paling dipuji meskipun kemungkinan manfaat yang tidak dibutuhkan).
- CONS:
2.1. Ketika melewati Parameter ke. NET SqlCommand, Anda harus menentukan System.Data.SqlDbType.DateTime2apakah Anda mungkin melewati nilai di luar DateTimerentang dan / atau presisi SQL Server , karena itu default untuk System.Data.SqlDbType.DateTime.
2.2. Tidak dapat secara implisit / mudah dikonversi ke nilai numerik floating-point (# hari sejak min date-time) untuk melakukan hal berikut ke / dengan itu dalam ekspresi SQL Server menggunakan nilai numerik dan operator:
2.2.1. tambahkan atau kurangi # hari atau sebagian hari. Catatan: Menggunakan DateAddFungsi sebagai solusi bukanlah hal yang sepele ketika Anda perlu mempertimbangkan banyak jika tidak semua bagian dari tanggal-waktu.
2.2.2. ambil perbedaan antara dua kali tanggal untuk keperluan perhitungan "usia". Catatan: Anda tidak bisa hanya menggunakan DateDiffFungsi SQL Server sebagai gantinya, karena itu tidak menghitung ageseperti yang diharapkan kebanyakan orang bahwa jika dua tanggal-waktu terjadi untuk melintasi batas kalender / jam tanggal-waktu dari unit yang ditentukan jika bahkan untuk sebagian kecil dari unit itu, ia akan mengembalikan selisih 1 dari unit itu vs 0. Misalnya, DateDiffdalam Daydua kali tanggal hanya terpisah 1 milidetik akan mengembalikan 1 vs 0 (hari) jika waktu-waktu tersebut adalah pada hari kalender yang berbeda (yaitu "1999-12-31 23: 59: 59.9999999" dan "2000-01-01 00: 00: 00.0000000"). Perbedaan waktu yang sama 1 milidetik jika dipindahkan sehingga tidak melewati hari kalender, akan mengembalikan "DateDiff" dalam Day0 (hari).
2.2.3. ambil Avgtanggal-waktu (dalam Kueri Agregat) dengan hanya mengonversi ke "Float" terlebih dahulu dan kemudian kembali lagi ke DateTime.
CATATAN: Untuk mengonversi DateTime2menjadi angka, Anda harus melakukan sesuatu seperti rumus berikut yang masih mengasumsikan nilai Anda tidak kurang dari tahun 1970 (yang berarti Anda kehilangan semua rentang tambahan ditambah 217 tahun lagi. Catatan: Anda dapat tidak dapat hanya menyesuaikan rumus untuk memungkinkan rentang tambahan karena Anda dapat mengalami masalah luapan numerik.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0- Sumber: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "
Tentu saja, Anda bisa juga Castuntuk yang DateTimepertama (dan jika perlu kembali lagi ke DateTime2), tetapi Anda akan kehilangan ketepatan dan jangkauan (semua sebelum tahun 1753) manfaat DateTime2vs DateTimeyang merupakan 2 terbesar dan juga pada saat yang sama prolly 2 yang paling tidak mungkin diperlukan yang menimbulkan pertanyaan mengapa menggunakannya ketika Anda kehilangan konversi implisit / mudah ke angka floating-point (# hari) untuk tambahan / pengurangan / "usia" (vs DateDiff) / Avgmanfaat calc yang merupakan hal besar dalam pengalaman saya.
Btw, Avgtanggal-waktu adalah (atau setidaknya seharusnya ) kasus penggunaan yang penting. a) Selain digunakan dalam mendapatkan durasi rata-rata ketika tanggal-waktu (karena tanggal-waktu basis umum) digunakan untuk mewakili durasi (praktik umum), b) juga berguna untuk mendapatkan statistik tipe dasbor tentang apa yang rata-rata tanggal- waktu dalam kolom tanggal-waktu dari rentang / grup Baris. c) Standar (atau paling tidak harus standar) Permintaan ad-hoc untuk memantau / memecahkan masalah nilai-nilai dalam suatu Kolom yang mungkin tidak berlaku lagi / lebih lama dan / atau mungkin perlu dihentikan adalah mendaftar untuk setiap nilai hitungan kejadian dan (jika tersedia) perangko Min, Avgdan Maxtanggal-waktu yang terkait dengan nilai itu.