我想将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')
如何正确进行转换?
答案 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'));