Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách chuyển đổi dấu thời gian Unix thành giá trị ngày / giờ trong SQL Server

Trong SQL Server, chúng ta có thể sử dụng phương pháp sau để trả về ngày và giờ dựa trên dấu thời gian Unix nhất định.

Dấu thời gian Unix (còn được gọi là thời gian Unix Epoch, Unix time, hoặc POSIX time) là số giây đã trôi qua kể từ 00:00:00 Thứ Năm, ngày 1 tháng 1 năm 1970, Giờ Phối hợp Quốc tế (UTC).

Ví dụ

Dưới đây là một ví dụ về chuyển đổi dấu thời gian Unix thành giá trị ngày / giờ:

SELECT DATEADD(s, 1860935119, '1970-01-01');

Kết quả:

2028-12-20 14:25:19.000

Trong trường hợp này, dấu thời gian unix là 1860935119, được dịch thành ngày và giờ 2028-12-20 14:25:19.000.

Ngày / Giờ hiện tại

Dưới đây là một ví dụ sử dụng dấu thời gian Unix dựa trên ngày / giờ hiện tại:

SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');

Kết quả:

2022-04-18 00:31:46.000

Xin lưu ý bạn, điều này là thừa, bởi vì chúng tôi có thể chỉ làm những việc sau:

SELECT GETUTCDATE();

Dấu thời gian Unix lớn hơn

Khi gặp phải giá trị dấu thời gian Unix lớn hơn như sau:

SELECT DATEADD(s, 1867914562715876900, '1970-01-01');

Chúng tôi có thể gặp lỗi tràn như sau:

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.

Đó là bởi vì giá trị dấu thời gian Unix lớn hơn giá trị mà một số nguyên có thể giữ. Dấu thời gian Unix này chứa độ chính xác nano giây và có quá nhiều chữ số cho một số nguyên.

Chúng tôi có một số lựa chọn để giải quyết vấn đề này. Một tùy chọn là giảm độ chính xác:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');

Kết quả:

2029-03-11 09:09:22.000

Ở đây, chúng tôi đã sử dụng LEFT() hàm chỉ trả về mười chữ số đầu tiên, cũng như CONVERT() hàm trả về một số nguyên.

Nếu không muốn giảm độ chính xác, chúng ta có thể làm như sau:

DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
    ns, 
    @ts % 1000000000, 
    DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
    );

Kết quả:

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. @@ IDENTITY, SCOPE_IDENTITY (), OUTPUT và các phương pháp truy xuất danh tính cuối cùng khác

  2. Trả về danh sách các sự kiện kích hoạt máy chủ trong SQL Server

  3. Làm thế nào để chỉ nhận các giá trị cột số?

  4. Cách tắt CDC trên tập hợp bảng HOẶC tắt trên tất cả bảng trong cơ sở dữ liệu trong SQL Server - Hướng dẫn sử dụng SQL Server

  5. Câu lệnh SQL UPDATE để chuyển hai giá trị thành hai hàng