32

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

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

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

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

我使用了DATEADD如下函数,但这通过提供毫秒作为差异给出了算术溢出异常:

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

如何正确进行转换?

4

7 回答 7

61
DECLARE @UTC BIGINT
SET @UTC = 1348203320997 

SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC / 1000, '19700101'))
于 2012-09-21T05:24:31.160 回答
5

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

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)

于 2015-05-21T07:53:24.647 回答
3

我在使用此处给出的答案时遇到了问题(尤其是系统正在计算 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)
于 2014-02-05T13:16:17.610 回答
3

使用 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)
于 2016-03-31T17:18:44.443 回答
1

DATEADD需要一个整数作为第二个参数。您的数字1348203320000对于整数来说非常大,因此它会在运行时产生错误。您应该改用biginttype 并通过将毫秒拆分为秒和毫秒来为 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
于 2012-09-21T05:24:04.670 回答
0

现在,您可以将 dateadd 与分而不是秒一起使用。

代码将是这样的:

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

于 2018-05-15T14:56:38.850 回答
0
=dateadd("d",INT((Fields!lastLogon.Value / 864000000000)- 134774),"1970-01-01 00:00:00")

这就是我在 SSRS 中用来解决 INT 错误的方法,使用天而不是秒。这是错的吗?

于 2022-01-22T00:59:34.967 回答