2017-09-05 6 views
0

私は、ユーザアプリケーション用に「過去30日間」の動的SQL日付フィルタを作成しようとしています。日付列は、Unixエポックミリ秒のタイムスタンプです。ツールのSQLでの動的Unixエポック時間の選択

前の反復は、ユーザーが日付の範囲を選択することができ、私は今ちょうど最後の30

を選択するためにそれを変更していたデータは、from_unixtimeをサポートしていません赤方偏移に格納されています。

  1. データは、UTCに格納され、EST(UTC -5)の日付でフィルタリングする必要がある:

    Iは、2つの課題を有しています。

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

    アプリケーションが起動を更新してしまう:

  2. 「過去30日間の選択」
  3. は以前、私のコードは次のように見えた

昨日深夜に切断し、かつ服用昨日マイナス29意味しますユーザによって記述された終了日を含む。このコードは時差に合わせて調整されます。

Redshift SQLの制約を使用して、とDATEADD()をUnixタイムスタンプで使用するにはどうすればよいですか?

ありがとうございました。

答えて

0

extract('epoch' from ts)あなたのUNIXタイムスタンプを与え、あなただけの追加を使用してexamplingため、他のUDLsを書くことができますので、他の日付関数の多くは、Pythonの標準ライブラリdatetime moduleにあります。

:それは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は、以下のように赤方偏移で表すことができるされているかのようにUTCを照会する5時間

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

ちょっと醜いですが、そのように動作します。

0

PythonとPython標準datetimeモジュールを使用して、Redshiftデータベース用にユーザー定義関数(UDF)を書きたいと思っています。 http://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html

Creating a Scalar Python UDFのセクションに従ってください。

私はあなたの質問や文脈をよく理解していませんが、UDLを使いたいものを手に入れる方法が分かります。 2つの日付時刻あなたが書くでしょう(UTC、EST内の1つの内の1)は、以下のようなものです(テストされていない)との間にミリ秒単位で取得する例えば

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; 

これは、SQLのdatetime間のミリ秒を計算しaつまり、UTCbで、これはESTにあります。 %Z形式は、タイムゾーン用に使用されます。使用法は次のようになります。

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

もちろんUnixエポックは、実際に'1970-01-01 00:00:00'です。

あなたがGETDATE()またはDATEADD()のようなものが必要な場合はtimedelta

関連する問題