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