Di SQL Server, kita dapat menggunakan metode berikut untuk mengembalikan tanggal dan waktu berdasarkan stempel waktu Unix yang diberikan.
Stempel waktu Unix (juga dikenal sebagai waktu Unix Epoch, waktu Unix, atau waktu POSIX) adalah jumlah detik yang telah berlalu sejak 00:00:00 Kamis, 1 Januari 1970, Waktu Universal Terkoordinasi (UTC).
Contoh
Berikut ini contoh mengonversi stempel waktu Unix menjadi nilai tanggal/waktu:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Hasil:
2028-12-20 14:25:19.000
Dalam hal ini, cap waktu unix adalah 1860935119, yang diterjemahkan ke dalam tanggal dan waktu 2028-12-20 14:25:19.000.
Tanggal/Waktu Saat Ini
Berikut adalah contoh yang menggunakan stempel waktu Unix berdasarkan tanggal/waktu saat ini:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Hasil:
2022-04-18 00:31:46.000
Ingat, ini berlebihan, karena kita bisa saja melakukan hal berikut:
SELECT GETUTCDATE();
Stempel Waktu Unix Lebih Besar
Ketika dihadapkan dengan nilai stempel waktu Unix yang lebih besar seperti berikut:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Kita bisa mendapatkan kesalahan overflow seperti ini:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Itu karena nilai stempel waktu Unix lebih besar dari yang dapat ditampung oleh bilangan bulat. Stempel waktu Unix ini berisi presisi nanodetik dan memiliki terlalu banyak digit untuk sebuah bilangan bulat.
Kami memiliki beberapa opsi untuk menangani ini. Salah satu opsi adalah mengurangi presisi:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Hasil:
2029-03-11 09:09:22.000
Di sini, kami menggunakan LEFT()
berfungsi untuk mengembalikan hanya sepuluh digit pertama, serta CONVERT()
fungsi untuk mengembalikan bilangan bulat.
Jika kita tidak ingin mengurangi presisi, kita dapat melakukan sesuatu seperti ini:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Hasil:
2029-03-11 09:09:22.7158769