Jakiego typu danych należy użyć jako znacznika czasu w DynamoDB?

103

Jestem nowy w DynamoDB. Chcę utworzyć tabelę, która używa DeviceID jako klucza skrótu, Timestamp jako mojego klucza zakresu i niektórych danych.

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

W SQL możemy użyć typu datetime jako znacznika czasu, ale w DynamoDB nie ma takiego.

  1. Jakiego typu danych mam użyć? Strunowy? Numer?
    wprowadź opis obrazu tutaj

  2. W jakim formacie znacznika czasu należy wpisać dla wybranego typu danych? Format ISO (np .: 2016-11-11T17: 21: 07.5272333Z) czy czas epoki (np .: 1478943038816)?

  3. Muszę przeszukać tabelę w określonym przedziale czasu, np .: 01.01.2015 10:00:00 do 31.12.2016 23:00:00

Dennis
źródło
2
Używamy liczby w czasie / formacie epoki. Używamy go również do wyszukiwania zakresów, a także w zasadzie customer_id
George M Whitaker
Można używać typów danych String i Number. Ciąg znaków podczas przechowywania formatu ISO8601 i liczba podczas przechowywania czasu epoki. Więcej informacji tutaj: abhayachauhan.com/2017/12/…
Abhaya Chauhan
Offical doc mówi: „Można użyć typu danych Ciąg reprezentować datę lub datownik. Jednym ze sposobów, aby to zrobić jest za pomocą ISO 8601 sznurki”.
Hong
Odpowiedź, z której skopiowałeś swój zrzut ekranu ( stackoverflow.com/a/27894543/1357094 ), odpowiada na to pytanie - a to pytanie w rzeczywistości powiela pytanie odpowiedzi w pierwszej kolejności: stackoverflow.com/questions/27894393/ ...
cellepo

Odpowiedzi:

85

Typ danych String należy stosować datę lub datownik.

Możesz użyć typu danych String, aby przedstawić datę lub znacznik czasu. Jednym ze sposobów jest użycie ciągów ISO 8601, jak pokazano w poniższych przykładach:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Typ danych DynamoDB dla daty lub znacznika czasu

Tak, zapytania o zakres są obsługiwane, gdy data jest przechowywana jako ciąg. MIĘDZY może być stosowany na FilterExpresssion. Otrzymałem elementy w wyniku za pomocą poniższych wyrażeń filtrujących.

Wyrażenie filtra bez czasu: -

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

Wyrażenie filtra z czasem: -

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

Wartości bazy danych: -

Format 1 - ze strefą czasową:

{"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 - bez strefy czasowej: -

{"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."}}}}}
pytanie o pojęcie
źródło
Ale czy możesz wyszukiwać zakres dat, gdy są przechowywane jako wartości ciągów?
Mark B
@notionquest ya, czy możesz przeszukać zakres dat i godzin za pomocą ciągu znaków?
Dennis
57
Nie rozumiem, jak doszło do tego, że „Typ danych typu String powinien być używany jako Data lub Znacznik czasu”. Dokumenty mówią również, że możesz również użyć typu danych Liczba dla dat według czasu epoki. Jak myślisz, dlaczego String powinien być używany zamiast Number?
Roly,
1
Można używać typów danych String i Number. Ciąg znaków podczas przechowywania formatu ISO8601 i liczba podczas przechowywania czasu epoki. Więcej informacji tutaj: abhayachauhan.com/2017/12/…
Abhaya Chauhan
2
Numery @roly również powinny działać dobrze, ale są mniej czytelne.
Matthew Bonig,
28

Typ danych zależy od Twoich wymagań.

Możesz użyć ciągu znaków w formacie ISO lub liczby w formacie epoki.

Zaletą formatu ISO (String) jest czytelność dla człowieka, jednak DynamoDB nie obsługuje Time To Live (TTL) dla tego formatu. Wszystkie filtry działają, np. „Między” i „zakres”, jak wyjaśniono w zapytaniu o pojęcie.

Czas życia (TTL) wygaśnięcia dla DynamoDB pozwala zdefiniować, kiedy elementy w tabeli wygasają, dzięki czemu mogą być automatycznie usuwane z bazy danych.

Zaletą korzystania z formatu epoki (liczby) jest to, że można używać funkcji TTL i wszystkich filtrów.

TLDR;

Format epoki (typ liczbowy) - Można używać
formatu ISO Time To Live (typ String) - Nie można używać Time To Live, ale jest bardziej czytelny dla człowieka

TheKnightCoder
źródło
Wyrażenia filtru mogą być obsługiwane przez liczby, ale warunki kluczowe oparte na zakresie byłyby obsługiwane tylko w przypadku ciągów znaków w formacie ISO
Rafael Almeida
@RafaelAlmeida, co masz na myśli? A jakie są twoje źródła?
Zachary Ryan Smith
1
@ZacharyRyanSmith Myliłem się - rzeczywiście, atrybuty liczbowe działają jako klucze sortowania oraz w kluczowych warunkach w filtrach.
Rafael Almeida
2

Typ danych Number LUB typ danych String

może być użyty jako data lub znacznik czasu - nie tylko jako ciąg, ponieważ zaakceptowana odpowiedź na to pytanie nieprawidłowo wyróżnia się, ignorując liczbę.

Możesz użyć typu danych liczba, aby przedstawić datę lub znacznik czasu. Jednym ze sposobów jest użycie czasu epoki - liczby sekund od godziny 00:00:00 czasu UTC 1 stycznia 1970 r. Na przykład czas epoki 1437136300 oznacza 12:31:40 czasu UTC 17 lipca 2015 r.

Więcej informacji można znaleźć pod adresem http://en.wikipedia.org/wiki/Unix_time .

...

Możesz użyć typu danych String, aby przedstawić datę lub znacznik czasu. Jednym ze sposobów jest użycie ciągów ISO 8601, jak pokazano w poniższych przykładach:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Więcej informacji można znaleźć pod adresem http://en.wikipedia.org/wiki/ISO_8601 .

Typ danych DynamoDB dla daty lub znacznika czasu

cellepo
źródło
1

aby móc odfiltrować wyniki podczas wysyłania zapytania, użyłem formatu epoki dla DateTime, jest to bardziej wydajne niż użycie stringów.

wyobraź sobie te scenariusze: ostatnie 31 dni, ostatnie 24 godziny, ... znowu wszystko jest możliwe przy użyciu formatu string, ponieważ ma on również operator begin_with ( sprawdź trzeci przykład w poniższym linku w dokumencie AWS ), ale wartości liczbowe są znacznie bardziej wydajne pod względem wydajności podczas sortowania (porównywania) i obliczeń.

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

łatwo jest przekonwertować datę i godzinę na format epoki

JavaScript:

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

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

DO#

Pyton

import time
epoch = time.time()
 
# converting back to date-time
initial_date = time.gmtime(epoch )
Mohammad Khodabandeh
źródło