DynamoDBのタイムスタンプにはどのデータ型を使用する必要がありますか?


101

DynamoDBは初めてです。DeviceIDをハッシュキー、Timestampを範囲キー、およびいくつかのデータとして使用するテーブルを作成したいと思います。

{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }

SQLでは、タイムスタンプに日時型を使用できますが、DynamoDBでは使用できません。

  1. どのデータ型を使用する必要がありますか?ストリング?数?
    ここに画像の説明を入力してください

  2. 選択したデータ型について、どのようなタイムスタンプ形式を書き込む必要がありますか?ISO形式(例:2016-11-11T17:21:07.5272333Z)またはエポックタイム(例:1478943038816)?

  3. ある範囲の時間でテーブルを検索する必要があります。例:2015年1月1日午前10:00:00から2016年12月31日午後11:00:00まで



2
エポックタイム/フォーマットの数値を使用します。基本的にcustomer_idと一緒に範囲検索にも使用します
George M Whitaker

文字列と数値のデータ型を使用できます。ISO8601形式を保存する場合は文字列、エポック時間を保存する場合は数値。詳細はこちら:abhayachauhan.com/2017/12/…–
Abhaya Chauhan

公式ドキュメントは、「あなたは、日付またはタイムスタンプを表現するために、文字列データ型を使用することができます。これを行う1つの方法は、ISO 8601個の文字列を使用することである」、と言います。
香港

あなたは(あなたからのスクリーンショットをコピーした回答stackoverflow.com/a/27894543/1357094: - )、この質問に答える最初の場所で回答者の質問とこの質問、実際に重複 stackoverflow.com/questions/27894393/...
cellepo

回答:


84

Stringデータ型は、日付またはタイムスタンプのために使用すべきです。

Stringデータ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、次の例に示すように、ISO8601文字列を使用することです。

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

日付またはタイムスタンプのDynamoDBデータ型

はい、日付が文字列として保存されている場合、範囲クエリがサポートされます。BETWEEN FilterExpresssion上で使用することができます。以下のフィルター式を使用して、結果の項目を取得しました。

時間のないFilterExpression:-

FilterExpression : 'createdate between :val1 and :val2',
ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ":val1" : "2010-01-01",
        ":val2" : "2010-12-31"
    }

時間のあるFilterExpression:-

FilterExpression : 'createdate between :val1 and :val2',
    ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ":val1" : "2010-01-01T00:00:00",
        ":val2" : "2010-12-31T00:00:00"
    }

データベース値:-

形式1-タイムゾーン付き:

{"Item":{"createdate":{"S":"2010-12-21T17:42:34+00:00"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}

形式2-タイムゾーンなし:-

{"Item":{"createdate":{"S":"2010-12-21T17:42:34Z"},"title":{"S":"The Big New Movie 2010"},"yearkey":{"N":"2010"},"info":{"M":{"rating":{"N":"0"},"plot":{"S":"Nothing happens at all."}}}}}

しかし、文字列値として保存されているときに日付範囲検索を実行できますか?
マークB

@notionquest ya、Stringを使用して日付と時刻の範囲を検索できますか?
デニス

57
「文字列データ型日付またはタイムスタンプに使用する必要があります」に到達した方法がわかりません。ドキュメントには、エポックタイムを介した日付にNumberデータ型を使用することもできると書かれています。なぜ文字列を数値よりも使用する必要があると思いますか?
Roly 2017

1
文字列と数値のデータ型を使用できます。ISO8601形式を保存する場合は文字列、エポック時間を保存する場合は数値。詳細はこちら:abhayachauhan.com/2017/12/…–
Abhaya Chauhan

2
@roly番号も正常に機能するはずですが、読みにくくなっています。
Matthew Bonig 2018

27

データ型は要件によって異なります。

ISO形式を使用した文字列またはエポック形式を使用した数値を使用できます。

ISO形式(文字列)の利点は人間が読みやすいことですが、DynamoDBはこの形式の存続可能時間(TTL)をサポートしていません。notionquestで説明されているように、すべてのフィルターは「between」と「range」などで機能します。

DynamoDBの存続時間(TTL)を使用すると、テーブル内のアイテムの有効期限を定義して、データベースから自動的に削除できるようにすることができます。

エポック形式(数値)を使用する利点は、TTL機能とすべてのフィルターを使用できることです。

TLDR;

エポック形式(数値型)-存続可能時間
ISO形式(文字列型)を使用できます-存続可能時間は使用できませんが、より人間が読める形式です


フィルタ式は数値でサポートされる場合がありますが、範囲ベースのキー条件はISO形式の文字列でのみサポートされます
RafaelAlmeida20年

@RafaelAlmeida、どういう意味ですか?そして、あなたの情報源は何ですか?
Zachary

1
@ZacharyRyanSmith私は間違っていました-確かに、数値属性は並べ替えキーとして、およびフィルターのキー条件で機能します。
ラファエルアルメイダ

2

数値データ型または文字列データ型

日付またはタイムスタンプに使用できます-この質問の承認された回答が数値を無視しているときに誤って選択されるため、文字列だけではありません

数値データ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、エポック時間(1970年1月1日の00:00:00 UTCからの秒数)を使用することです。たとえば、エポック時間1437136300は、2015年7月17日の12:31:40 PMUTCを表します。

詳細については、http://en.wikipedia.org/wiki/Unix_timeを参照してください

..。

Stringデータ型を使用して、日付またはタイムスタンプを表すことができます。これを行う1つの方法は、次の例に示すように、ISO8601文字列を使用することです。

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

詳細については、http://en.wikipedia.org/wiki/ISO_8601を参照してください

日付またはタイムスタンプのDynamoDBデータ型


1

クエリリクエストを送信するときに結果を除外できるようにするために、DateTimeにエポック形式を使用しました。文字列を使用するよりも効率的です。

これらのシナリオを想像してみてください:過去31日間、過去24時間、...ここでもbegins_with演算子(AWSドキュメントの以下のリンクの3番目の例を確認してください)があるため、文字列形式を使用してすべてが可能ですが、数値ははるかに効率的ですソート(比較)および計算中のパフォーマンスの評価。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.KeyConditionExpressions

日時をエポック形式に変換するのは簡単です

Javascript:

var date = new Date();
var epoch = date.getTime();

// converting back to date-time
var initial_date = new Date(epoch);

C#

Python

import time
epoch = time.time()
 
# converting back to date-time
initial_date = time.gmtime(epoch )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.