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

Cara Mengonversi Stempel Waktu Unix ke Nilai Tanggal/Waktu di SQL Server

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa mengeksekusi prosedur tersimpan lebih cepat daripada kueri SQL dari skrip?

  2. DB_NAME() vs ORIGINAL_DB_NAME() di SQL Server:Apa Bedanya?

  3. Bagaimana cara menemukan duplikat di beberapa kolom?

  4. Apakah ada perbedaan antara DateTime di c # dan DateTime di SQL server?

  5. Ubah 'datetimeoffset' menjadi 'smalldatetime' di SQL Server (Contoh T-SQL)