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.
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)?
Muszę przeszukać tabelę w określonym przedziale czasu, np .: 01.01.2015 10:00:00 do 31.12.2016 23:00:00
Odpowiedzi:
Typ danych String należy stosować datę lub datownik.
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: -
Wyrażenie filtra z czasem: -
Wartości bazy danych: -
Format 1 - ze strefą czasową:
Format 2 - bez strefy czasowej: -
źródło
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.
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
źródło
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ę.
Typ danych DynamoDB dla daty lub znacznika czasu
źródło
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#
var date = DateTime.UtcNow; var epoch = new DateTimeOffset(date).ToUnixTimeSeconds(); // converting back to date-time var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);
Pyton
import time epoch = time.time() # converting back to date-time initial_date = time.gmtime(epoch )
źródło