【问题标题】:Query epoch time using SQL Server to find date range使用 SQL Server 查询纪元时间以查找日期范围
【发布时间】:2016-01-11 20:11:50
【问题描述】:

我必须查询一个 SQL Server 数据库,并且表的值使用 Epoch 时间(一个 int。这是一个示例 - 1438005018)。我想知道如何编写查询以便我可以说出以下内容...

select
  * 
from 
  tablename
where
  epochdate between 'yesterday at 12:00' and 'today at 12:00' --this is the part I'm not sure about.

理想情况下,如果它很容易,我希望查询使用非纪元逻辑,因为纪元时间会让我感到困惑。也许有一种在 SQL Server 中转换的快速方法?

【问题讨论】:

  • 你是什么意思表的值使用纪元时间?该列是什么数据类型 - 它不是日期时间吗?有哪些典型值?
  • 请具体说明epochdate 是什么数据类型。它是一个 BIGINT 包含自 1970 年 1 月 1 日 或类似的秒数?
  • 这是一种解决方案,如果您能够创建可以查询的函数,假设如上所述,您的意思是 Unix 纪元时间:stackoverflow.com/questions/2904256/…
  • 这是列中值的示例。 1438005018. 这只是一个 INT

标签: sql-server epoch


【解决方案1】:

我在上面的 cmets 中发布了一个链接,如果您能够在正在使用的数据库中部署函数,这可能是一个更实用的解决方案,但如果您只能查询,这是一个选项也可以试试(假设 SQL Server 2008 及更高版本):

declare @todayepoch bigint, @yesterdayepoch bigint;

select @todayepoch = 
          cast((cast(dateadd(hour, 12, 
             cast(cast(sysutcdatetime() as date) as datetime)) as decimal(24,10))
                - cast(cast('1970-01-01' as datetime) as decimal(24,10)))
                    *60.0*60.0*24.0 as int), -- + 18000, --Eastern time
      @yesterdayepoch = 
          cast((cast(dateadd(hour, -12, 
             cast(cast(sysutcdatetime() as date) as datetime)) as decimal(24,10))
                - cast(cast('1970-01-01' as datetime) as decimal(24,10)))
                    *60.0*60.0*24.0 as int) -- + 18000 --Eastern time

select @todayepoch, @yesterdayepoch

    select
      * 
    from 
      tablename
    where
      epochdate between @yesterdayepoch and @todayepoch

我在上面使用 UTC 作为基于 UTC 时间进行比较的假设,但您也可以与您的时区进行比较,以秒为单位适当加/减您的时区差异(例如,将 18000 添加到每个变量以获得东部标准时间中午)。

您可以使用http://www.epochconverter.com/ 比较变量中的值来测试您的结果。

【讨论】:

    【解决方案2】:

    您的查询将如下所示:

    DECLARE @dt_from DATETIME;
    DECLARE @dt_to DATETIME; 
    SELECT 
        @dt_from=DATEADD(HH,-12,CAST(FLOOR(CAST(GETUTCDATE() AS FLOAT)) AS DATETIME)), -- strip time of current UTC date/time, and subtract 12 hrs
        @dt_to=DATEADD(HH,+12,CAST(FLOOR(CAST(GETUTCDATE() AS FLOAT)) AS DATETIME));   -- strip time of current UTC date/time, and add 12 hrs
    
    SELECT
        *
    FROM
        tablename
    WHERE
        epochdate BETWEEN DATEDIFF(s,'1970-01-01',@dt_from) AND DATEDIFF(s,'1970-01-01',@dt_to);
    

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多