【问题标题】:Selecting dynamic Unix Epoch time with SQL使用 SQL 选择动态 Unix 纪元时间
【发布时间】:2018-02-14 00:22:21
【问题描述】:

我正在尝试为用户应用程序构建“过去 30 天”动态 SQL 日期过滤器。日期列是一个 unix 纪元毫秒时间戳。

该工具的先前迭代允许用户选择一个日期范围,我现在只是将其更改为选择最后 30 个。

数据存储在Redshift中,不支持from_unixtime

我有两个挑战:

  1. 数据以 UTC 格式存储,需要使用 EST (UTC -5) 中的日期进行过滤。
  2. “选择过去 30 天”是指昨天午夜截断,取昨天负 29。

以前,我的代码是这样的:

"datecol" >= DATEDIFF(millisecs, '1969-12-31 19:00:00', ''start date' 00:00:00') 
AND "datecol" <= DATEDIFF(millisecs, '1969-12-31 19:00:00', ''end date' 23:59:59')

应用程序将按照用户的描述更新开始日期和结束日期。此代码针对时差进行了调整。

如何使用 Redshift SQL 的约束在 Unix 时间戳上使用 GETDATE()DATEADD()

谢谢。

【问题讨论】:

    标签: mysql sql datetime unix amazon-redshift


    【解决方案1】:

    我认为您想使用 Python 和 Python 标准 datetime 模块为您的 Redshift 数据库编写一个用户定义函数 (UDF)。见http://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html

    关注标题为Creating a Scalar Python UDF的部分。

    我不太了解您的查询或上下文,但我认为您可以弄清楚如何使用 UDL 获得所需的内容。

    例如,要获取两个日期时间之间的毫秒数(一个在 UTC,一个在 EST),您可以编写如下(未经测试):

    CREATE FUNCTION datediff_py(a datetime, b datetime)
      returns float
    stable
    as $$
        #python code goes here between the $$
        from datetime import datetime
        FMT = '%Y-%m-%d %H:%M:%S' #dates like '2016-12-24 23:59:59'
        tdelta = datetime.strptime(a + " UTC", FMT + " %Z") - datetime.strptime(b + " EST", FMT + " %Z")
        return tdelta.total_seconds()*1000
    
    $$ language plpythonu;
    

    这会计算UTC 中的 SQL 日期时间 aEST 中的 b 之间的毫秒数。 %Z 格式用于时区。一种用法是:

    "datecol" &gt;= datediff_py('1969-12-31 19:00:00', user_date)

    当然 Unix 纪元实际上是 '1970-01-01 00:00:00'

    Python 标准库datetime module 中还有很多其他的日期函数,因此如果您需要GETDATE()DATEADD() 之类的东西,可以编写其他UDL,例如使用timedelta

    【讨论】:

      【解决方案2】:

      extract('epoch' from ts) 为您提供 unix 时间戳,您只需添加 5 小时来查询 UTC,就好像它是 EST(如果 EST 是 UTC-5,那么 UTC 是 EST+5)

      between extract('epoch' from ('<<date1>>' + interval '5 hour'))
      and extract('epoch' from ('<<date2>>' + interval '29 hour' - interval '1 second'))
      

      另外,from_unixtime 在 Redshift 中可以表示如下:

      select timestamp 'epoch' + unix_ts_column * interval '1 second'
      

      有点难看,但就是这样工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-19
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 2014-09-25
        • 2010-10-06
        • 2016-06-15
        • 1970-01-01
        相关资源
        最近更新 更多