2012-09-21 64 views
17

Tôi muốn chuyển đổi UTC mili giây sang DateTime trong máy chủ SQL.Chuyển đổi UTC Mili giây sang DATETIME trong SQL server

này có thể dễ dàng được thực hiện trong C# bằng đoạn mã sau:

DateTime startDate = new DateTime(1970, 1, 1).AddMilliseconds(1348203320000); 

tôi cần phải làm điều này trong SQL server. Tôi đã tìm thấy một số tập lệnh here, nhưng điều này đã thực hiện các dấu tick ban đầu từ 1900-01-01.

Tôi đã sử dụng các chức năng DATEADD như dưới đây, nhưng điều này đã đưa ra một ngoại lệ tràn số học bởi supping mili giây như sự khác biệt:

SELECT DATEADD(MILLISECOND,1348203320000,'1970-1-1') 

Làm thế nào tôi có thể thực hiện chuyển đổi cho đúng?

Trả lời

33
DECLARE @UTC BIGINT 
SET @UTC = 1348203320997 

SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC/1000, '19700101')) 
3

DATEADD yêu cầu số nguyên làm đối số thứ hai. Số của bạn 1348203320000 là rất lớn cho số nguyên do đó nó tạo ra một lỗi trong thời gian chạy. Thay vào đó, bạn nên sử dụng loại bigint và cung cấp DATEADD với giá trị int chính xác bằng cách tách mili giây của bạn thành giây và mili giây. Đó là mẫu bạn có thể sử dụng.

DECLARE @total bigint = 1348203320000; 

DECLARE @seconds int = @total/1000 
DECLARE @milliseconds int = @total % 1000; 

DECLARE @result datetime = '1970-1-1'; 
SET @result = DATEADD(SECOND, @seconds,@result); 
SET @result = DATEADD(MILLISECOND, @milliseconds,@result); 
SELECT @result 
1

Tôi đã có vấn đề với việc sử dụng những câu trả lời đưa ra ở đây (đặc biệt là hệ thống được tính hình thức ve 0001-01-01) - vì vậy tôi đã làm điều này:

CONVERT(DATETIME,[Time]/ 10000.0/1000/86400-693595) 

--explanation for [Time_in_Ticks]/ 10000.0/1000/86400-693595 
--Time is in "ticks" 
--10000 = number of ticks in Milisecond 
--1000 = number of milisecons in second 
--86400 = number of seconds in a day (24hours*60minutes*60second) 
--693595= number of days between 0001-01-01 and 1900-01-01 (which is base 
--   date when converting from int to datetime) 
2

Bên dưới hàm chuyển đổi mili giây để datetime

IF object_id('dbo.toDbTimeMSC', 'FN') IS NOT NULL DROP FUNCTION dbo.toDbTimeMSC 
GO 
CREATE FUNCTION [dbo].[toDbTimeMSC] (@unixTimeMSC BIGINT) RETURNS DATETIME 
BEGIN 
    RETURN DATEADD(MILLISECOND, @unixTimeMSC % 1000, DATEADD(SECOND, @unixTimeMSC/1000, '19700101')) 
END 
GO 

- chọn dbo.toDbTimeMSC (1348203320000)

-1

Sử dụng SQL Server 2008R2, kết quả này được yêu cầu:

CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp])/1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME) 
Các vấn đề liên quan