使用SQL选择动态Unix纪元时间

时间:2017-09-05 16:20:47

标签: mysql sql datetime unix amazon-redshift

我试图建立一个"过去30天"用户应用程序的动态SQL日期过滤器。日期列是unix纪元毫秒时间戳。

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

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

我有两个挑战:

  1. 数据以UTC格式存储,需要使用EST(UTC -5)中的日期进行过滤。
  2. "选择最近30天"意味着在昨天午夜切断,并在昨天减去29。
  3. 以前,我的代码看起来像这样:

    "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()

    感谢。

2 个答案:

答案 0 :(得分:0)

我认为您希望使用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;

这计算a中的{1}}和UTCb之间的SQL日期时间EST之间的毫秒数。 %Z格式用于时区。用法是:

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

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

Python标准库datetime module中还有很多其他日期函数,因此如果需要GETDATE()DATEADD()等内容,可以编写其他UDL,以便使用{{1}进行示例}}

答案 1 :(得分:0)

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'
有点难看,但就像那样