Welcher Datentyp sollte für den Zeitstempel in DynamoDB verwendet werden?


95

Ich bin neu in DynamoDB. Ich möchte eine Tabelle erstellen, die DeviceID als Hash-Schlüssel, Timestamp als Bereichsschlüssel und einige Daten verwendet.

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

In SQL können wir den Datum / Uhrzeit-Typ für den Zeitstempel verwenden, in DynamoDB gibt es jedoch keinen.

  1. Welchen Datentyp soll ich verwenden? String? Nummer?
    Geben Sie hier die Bildbeschreibung ein

  2. In welches Zeitstempelformat sollte ich für den ausgewählten Datentyp schreiben? ISO-Format (z. B. 2016-11-11T17: 21: 07.5272333Z) oder Epochenzeit (z. B. 1478943038816)?

  3. Ich muss die Tabelle über einen bestimmten Zeitraum durchsuchen, z. B.: 01.01.2015 10:00:00 Uhr bis 31.12.2016 23:00:00 Uhr



2
Wir verwenden eine Zahl in Epochenzeit / Format. Wir verwenden es auch für die Bereichssuche zusammen mit einer customer_id
George M Whitaker

String- und Number-Datentypen können verwendet werden. Zeichenfolge beim Speichern des ISO8601-Formats und Nummer beim Speichern der Epochenzeit. Weitere Infos hier: abhayachauhan.com/2017/12/…
Abhaya Chauhan

Das offizielle Dokument sagt: "Sie können den Zeichenfolgendatentyp verwenden, um ein Datum oder einen Zeitstempel darzustellen. Eine Möglichkeit, dies zu tun, ist die Verwendung von ISO 8601-Zeichenfolgen."
Hong

Die Antwort, von der Sie Ihren Screenshot kopiert haben ( stackoverflow.com/a/27894543/1357094 ), beantwortet diese Frage - und diese Frage dupliziert tatsächlich die Frage der Antwort an erster Stelle: stackoverflow.com/questions/27894393/…
cellepo

Antworten:


78

Der String-Datentyp sollte für Datum oder Zeitstempel verwendet werden.

Sie können den Datentyp String verwenden, um ein Datum oder einen Zeitstempel darzustellen. Eine Möglichkeit hierfür ist die Verwendung von ISO 8601-Zeichenfolgen, wie in den folgenden Beispielen gezeigt:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

DynamoDB-Datentyp für Datum oder Zeitstempel

Ja, die Bereichsabfragen werden unterstützt, wenn das Datum als Zeichenfolge gespeichert wird. Das ZWISCHEN kann in FilterExpresssion verwendet werden. Ich habe die Elemente im Ergebnis mit den folgenden Filterausdrücken erhalten.

FilterExpression ohne Zeit: -

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

FilterExpression mit der Zeit: -

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

Datenbankwerte: -

Format 1 - mit Zeitzone:

{"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."}}}}}

Format 2 - ohne Zeitzone: -

{"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."}}}}}

Aber können Sie Datumsbereichssuchen durchführen, wenn diese als Zeichenfolgenwerte gespeichert sind?
Mark B

@notionquest ya, kannst du mit String eine Datums- und Zeitbereichssuche durchführen?
Dennis

54
Ich sehe nicht, wie Sie zu "String-Datentyp sollte für Datum oder Zeitstempel verwendet werden" gekommen sind. In den Dokumenten heißt es auch, dass Sie den Datentyp Number auch für Datumsangaben über die Epochenzeit verwenden können. Warum sollte String Ihrer Meinung nach über Number verwendet werden?
Roly

1
String- und Number-Datentypen können verwendet werden. Zeichenfolge beim Speichern des ISO8601-Formats und Nummer beim Speichern der Epochenzeit. Weitere Infos hier: abhayachauhan.com/2017/12/…
Abhaya Chauhan

1
@roly-Zahlen sollten ebenfalls gut funktionieren, sind aber weniger lesbar.
Matthew Bonig

21

Der Datentyp hängt von Ihren Anforderungen ab.

Sie können String im ISO-Format oder Number im Epochenformat verwenden.

Der Vorteil des ISO-Formats (String) liegt in der menschlichen Lesbarkeit. DynamoDB unterstützt jedoch Time To Live (TTL) für dieses Format nicht. Alle Filter funktionieren wie 'zwischen' und 'Bereich', wie durch Begriffsquest erklärt.

Mit Time To Live (TTL) für DynamoDB können Sie festlegen, wann Elemente in einer Tabelle ablaufen, damit sie automatisch aus der Datenbank gelöscht werden können.

Der Vorteil der Verwendung des Epochenformats (Number) besteht darin, dass Sie die TTL-Funktion und alle Filter verwenden können.

TLDR;

Epochenformat (Zahlentyp) - Kann das Time To Live-
ISO-Format (String-Typ) verwenden. - Time To Live kann nicht verwendet werden, ist jedoch besser lesbar


Filterausdrücke werden möglicherweise durch Zahlen unterstützt, bereichsbasierte Schlüsselbedingungen werden jedoch nur mit Zeichenfolgen im ISO-Format unterstützt
Rafael Almeida,

@ RafaelAlmeida, was meinst du? Und was sind deine Quellen?
Zachary Ryan Smith

2

Der Datentyp Number ODER der Datentyp String

kann für Datum oder Zeitstempel verwendet werden - nicht nur für Zeichenfolge, da die akzeptierte Antwort auf diese Frage fälschlicherweise hervorgehoben wird, während die Nummer ignoriert wird.

Sie können den Datentyp Nummer verwenden, um ein Datum oder einen Zeitstempel darzustellen. Eine Möglichkeit hierfür ist die Verwendung der Epochenzeit - die Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970. Beispielsweise entspricht die Epochenzeit 1437136300 am 17. Juli 2015 12:31:40 UTC.

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/Unix_time .

...

Sie können den Datentyp String verwenden, um ein Datum oder einen Zeitstempel darzustellen. Eine Möglichkeit hierfür ist die Verwendung von ISO 8601-Zeichenfolgen, wie in den folgenden Beispielen gezeigt:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/ISO_8601 .

DynamoDB-Datentyp für Datum oder Zeitstempel


1

Damit ich beim Senden einer Abfrageanforderung Ergebnisse herausfiltern kann, habe ich das Epochenformat für DateTime verwendet. Es ist effizienter als die Verwendung von Zeichenfolgen.

Stellen Sie sich diese Szenarien vor: Die letzten 31 Tage, die letzten 24 Stunden, ... wieder ist alles mit dem Zeichenfolgenformat möglich, da es auch den Operator begin_with hat ( siehe drittes Beispiel im folgenden Link im AWS-Dokument ), aber numerische Werte sind wesentlich effizienter der Leistung beim Sortieren (Vergleichen) und Berechnen.

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

Es ist einfach, Datum und Uhrzeit in das Epochenformat zu konvertieren

Javascript:

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

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

C #

var date = DateTime.UtcNow;
var epoch = new DateTimeOffset(date).ToUnixTimeSeconds();

// converting back to date-time
var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);

Python

import time
epoch = time.time()
 
# converting back to date-time
initial_date = time.gmtime(epoch )
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.