Bagaimana cara mengonversi stempel waktu UNIX (bigint) ke DateTime di SQL Server?
sql
sql-server
datetime
unix-timestamp
salman
sumber
sumber
Ini berhasil untuk saya:
Jika ada yang bertanya-tanya mengapa 1970-01-01, ini disebut waktu Epoch .
Di bawah ini adalah kutipan dari Wikipedia:
sumber
Jika ada yang mendapatkan kesalahan di bawah ini:
karena stempel waktu unix ada di bigint (bukan int), Anda dapat menggunakan ini:
Ganti stempel waktu hardcode untuk kolom Anda yang sebenarnya dengan unix-timestamp
Sumber: MSSQL bigint Unix Timestamp ke Datetime dengan milidetik
sumber
Seperti ini
tambahkan tanggal waktu Unix (epoch) ke tanggal dasar dalam hitungan detik
ini akan mendapatkannya untuk saat ini (2010-05-25 07: 56: 23.000)
Jika Anda ingin mundur, lihat http://wiki.lessthandot.com/index.php/Epoch_Date ini
sumber
Ini akan melakukannya:
Bukannya! Presisi! gunakan: ss, ms atau mcs sesuai dengan ketepatan stempel waktu. Bigint mampu menahan presisi mikrodetik.
sumber
Uji ini:
Server Sql:
Server MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
sumber
Menambahkan n detik ke
1970-01-01
akan memberi Anda tanggal UTC karena n , stempel waktu Unix, adalah jumlah detik yang telah berlalu sejak 00:00:00 Waktu Universal Terkoordinasi (UTC), Kamis, 1 Januari 1970 .Di SQL Server 2016, Anda dapat mengonversi satu zona waktu ke zona waktu lainnya menggunakan
AT TIME ZONE
. Anda hanya perlu mengetahui nama zona waktu dalam format standar Windows:Atau sederhananya:
Catatan:
DATETIMEOFFSET
keDATETIME
.sumber
Jika waktu dalam milidetik dan seseorang perlu menyimpannya:
sumber
Ini membangun dari pekerjaan yang Daniel Little lakukan untuk pertanyaan ini, tetapi dengan mempertimbangkan penghematan waktu siang hari (bekerja untuk tanggal 01-01 1902 dan lebih besar karena batas int pada fungsi dateadd):
Pertama-tama kita perlu membuat tabel yang akan menyimpan rentang tanggal untuk penghematan waktu siang hari (sumber: Sejarah waktu di Amerika Serikat ):
Sekarang kami membuat fungsi untuk setiap zona waktu Amerika. Ini mengasumsikan waktu unix dalam milidetik. Jika dalam hitungan detik, hapus / 1000 dari kode:
Pasifik
Timur
Pusat
Gunung
Hawaii
Arizona
Alaska
sumber
sumber
Saya harus menghadapi masalah ini juga. Sayangnya, tidak ada jawaban (di sini dan di lusinan halaman lain) yang memuaskan bagi saya, karena saya masih belum bisa mencapai tanggal di luar tahun 2038 karena bilangan bulat 32 bit dipasang di suatu tempat.
Solusi yang berhasil bagi saya pada akhirnya adalah menggunakan
float
variabel, jadi saya dapat memiliki setidaknya tanggal maksimal2262-04-11T23:47:16.854775849
. Namun, ini tidak mencakup seluruhdatetime
domain, tetapi cukup untuk kebutuhan saya dan dapat membantu orang lain menghadapi masalah yang sama.Ada beberapa hal yang perlu diperhatikan:
@ticksofday
dan baris pertama algoritma yang sesuai.1900-01-01
adalah tanggal asal untukdatetime2
, sama seperti waktu1970-01-01
untuk stempel waktu unix.float
s membantu saya untuk memecahkan masalah tahun 2038 dan bilangan bulat yang meluap dan semacamnya, tetapi perlu diingat bahwa angka floating point tidak terlalu berkinerja dan dapat memperlambat pemrosesan sejumlah besar stempel waktu. Selain itu, float dapat menyebabkan hilangnya presisi karena kesalahan pembulatan, seperti yang Anda lihat dalam perbandingan hasil contoh untuk tanggal maksimum di atas (di sini, kesalahannya sekitar 1,4425ms).datetime
. Sayangnya, tidak ada cast eksplisit dari nilai numerik kedatetime2
diizinkan, tetapi diizinkan untuk mentransmisikan numerikdatetime
secara eksplisit dan ini, pada gilirannya, diterapkan secara implisit kedatetime2
. Ini mungkin benar, untuk saat ini, tetapi dapat berubah di versi SQL Server yang akan datang: Mungkin akan adadateadd_big()
fungsi atau pemeran eksplisit untukdatetime2
akan diizinkan atau pemeran eksplisitdatetime
akan tidak diizinkan, jadi ini mungkin rusak atau mungkin ada cara yang lebih mudah suatu hari nanti.sumber
Untuk GMT, berikut adalah cara termudah:
sumber
Lebih baik? Fungsi ini mengubah unixtime dalam milidetik menjadi datetime. Ini hilang milidetik, tetapi masih sangat berguna untuk pemfilteran.
sumber
Solusinya bisa sebagai berikut:
sumber
@DanielLittle memiliki jawaban termudah dan paling elegan untuk pertanyaan spesifik. Namun, jika Anda tertarik untuk mengonversi ke zona waktu tertentu DAN mempertimbangkan DST (Waktu Musim Panas), berikut ini berfungsi dengan baik:
Catatan: Solusi ini hanya berfungsi di SQL Server 2016 dan yang lebih baru (dan Azure).
Untuk membuat fungsi:
Anda dapat memanggil fungsi seperti ini:
sumber