【问题标题】:Date difference in Hours format from bigint in SQL ServerSQL Server 中的小时格式与 bigint 的日期差异
【发布时间】:2015-01-17 22:10:36
【问题描述】:

我有一列 bigint 类型的列,其中包含日期和时间信息(例如 135305651513530670401360839600 等)

我的要求是获取我上面提到的列和当前日期时间之间的 HOURS 格式的时间差。

我试图找到解决方案,但这些都太令人困惑了。我是 SQL Server 新手。

请帮忙。

【问题讨论】:

  • 如果它是日期和时间信息 - 为什么它没有正确存储在 DATETIME 列中?这就是他们的目的!另外:如何将日期和时间“损坏”(“编码”)成这种bigint 格式?这些数字代表什么?
  • 日期时间格式是由我安装在我的网站上的插件添加的。所以我不能改变他们的格式或做任何改变。我也不知道它们是如何编码的。
  • 如果您不知道日期是如何编码的,您希望如何获得两个编码日期之间的差异?你用的是什么插件?你检查过它的文档吗?问作者他们如何编码时间?它是 UNIX 时间戳吗?
  • 我用过 WizIQ 插件。我会联系他们以了解更多详情。

标签: sql-server-2008 datetime datediff bigint date-difference


【解决方案1】:

请试试这个。

declare @mydate datetime
DECLARE @LocalTimeOffset BIGINT
  ,@AdjustedLocalDatetime BIGINT

SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
SET @AdjustedLocalDatetime = 1416474000 - @LocalTimeOffset

SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime))
-- It will give you date 2014-11-20 14:30:00.000

数据差分运算:

select DATEDIFF(hour,@mydate,GETDATE())

创建函数

create  FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
  DECLARE @mydate datetime
  DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT

  SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
  SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
  SELECT @mydate=DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime))
  return @mydate
END;
GO

select mydate= dbo.fn_ConvertToDateTime (1416474000)

select DATEDIFF(hour,@mydate,GETDATE())

希望对您有所帮助。

【讨论】:

  • 我从前端添加了 i 日期 (11/20/2014 10:00:00 AM),它在 DB 中显示为 1416474000。当我尝试您的查询时,结果显示为 393056 小时。服务器上当前时间为 2014-11-20 01:57:09.670 时,必须小于 12 小时。我做错了什么吗?
  • 如果它不起作用而不是必要的更改您的列类型设置为 DATETIME 这将更容易获得小时差异它不是解决方案而是替代选项...
【解决方案2】:

这个数字看起来像一个 UNIX 时间戳,它是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。您可以使用简单的 DATEDIFF 从 datetime 获取 UNIX 时间戳:

declare @date datetime='2014-11-20T10:00:00'
declare @epoch datetime='19700101'

select DATEDIFF(s,@epoch,@date)

要获得两个时间戳之间的小时数,您只需将差值除以 3600(一小时内的秒数)即可。在计算差异之前,您无需将时间戳转换为日期:

declare @dateTS int=DATEDIFF(s,@epoch,@date)
declare @nowTS int=DATEDIFF(s,@epoch,GETUTCDATE())

select (@nowTS-@dateTS)/3600.0

请注意,我使用3600.0 来获得十进制结果。如果使用3600,小数部分将被截断,您将得到0 的差值小于1 小时。如果您想返回整个小时,这是可以的。

在查询中你可以这样写:

select (DATEDIFF(s,@epoch,GETUTCDATE())-[MY_TS_COLUMN])/3600.0 AS Hours
from [MY_TABLE]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多