我试图建立一个"过去30天"用户应用程序的动态SQL日期过滤器。日期列是unix纪元毫秒时间戳。
该工具的先前版本允许用户选择日期范围,我现在只需将其更改为选择最后一个日期范围。
数据存储在Redshift中,不支持from_unixtime
。
我有两个挑战:
以前,我的代码看起来像这样:
"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()
?
感谢。
答案 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}}和UTC
中b
之间的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'
有点难看,但就像那样