Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Konversi objek SQL Server DateTime ke BIGINT (.Net ticks)

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HAS_DBACCESS() – Temukan apakah Pengguna Dapat Mengakses Database di SQL Server

  2. Memotong biaya lisensi SQL Server

  3. Contoh sys.dm_sql_referenced_entities() SQL Server Mengembalikan Entitas yang Mereferensikan Server Tertaut

  4. Ikhtisar Kompresi Data di SQL Server

  5. SqlConnection SqlCommand SqlDataReader IDisposable