Saya memperdebatkan apakah akan memposting ini karena itu tergantung pada bagaimana tanggal disimpan pada tingkat biner di SQL Server, dan itu adalah solusi yang sangat rapuh. Untuk apa pun selain konversi satu kali, saya akan menggunakan sesuatu seperti jawaban yang diposting oleh @Solution Evangelist. Namun, Anda mungkin menganggap ini menarik dari segi akademis, jadi saya akan tetap mempostingnya.
Memanfaatkan fakta bahwa akurasi DateTime2
cocok dengan durasi centang di .NET dan keduanya didasarkan pada tanggal mulai 01-01-0001 00:00:00.0000000
, Anda dapat menggunakan DateTime
ke DateTime2
, lalu masukkan ke binary(9)
:0x07F06C999F3CB7340B
Informasi datetime disimpan RTL, jadi membalikkan, kita akan mendapatkan 0x0B34B73C9F996CF007
.
Tiga byte pertama menyimpan jumlah hari sejak 01-01-0001
dan 5 byte berikutnya menyimpan 100n kutu sejak tengah malam hari itu, jadi kita bisa menghitung jumlah hari, mengalikannya dengan kutu dalam sehari dan menambahkan kutu yang mewakili waktu yang telah berlalu untuk hari itu.
Jalankan kode berikut:
set @date = getdate()
set @ticksPerDay = 864000000000
declare @date2 datetime2 = @date
declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)
select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]
mengembalikan hasil berikut:
DateTime DateTime2 Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000
Mengambil jumlah Kutu yang dikembalikan dan mengonversi kembali ke DateTime di .NET:
DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();
Memberi kami kembali tanggal dari server sql:
2011-09-12 07:20:32.5870000