将UTC毫秒转换为SQL Server中的DATETIME

时间:2012-09-21 05:04:20

标签: sql-server datetime sql-server-2005 utc

我想将UTC毫秒转换为SQL Server中的DateTime。

这可以通过以下代码在C#中轻松完成:

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

我需要在SQL server中执行此操作。我找到了一些脚本here,但这是从1900-01-01开始的初始滴答。

我使用了DATEADD函数,如下所示,但是这给出了一个算术溢出异常,它将毫秒视为差异:

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

如何正确进行转换?

6 个答案:

答案 0 :(得分:45)

DECLARE @UTC BIGINT
SET @UTC = 1348203320997 

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

答案 1 :(得分:4)

在将毫秒转换为日期时间的函数

之下
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

- 选择dbo.toDbTimeMSC(1348203320000)

答案 2 :(得分:3)

DATEADD需要一个整数作为第二个参数。您的数字1348203320000对于整数来说非常大,因此它会在运行时产生错误。您应该使用bigint类型,并通过将毫秒分为秒和毫秒来为DATEADD提供正确的int值。这是你可以使用的样本。

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

答案 3 :(得分:2)

我在使用这里给出的答案时遇到了问题(特别是系统正在计算0001-01-01的刻度) - 所以我这样做了:

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)

答案 4 :(得分:2)

使用SQL Server 2008R2产生了所需的结果:

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)

答案 5 :(得分:0)

现在,你可以在分钟而不是秒上使用dateadd和division。

代码将是这样的:

DATEADD(MILLISECOND, epoch% 60000, DATEADD(MINUTE, epoch/ 60000, '19700101'));