Quel type de données doit être utilisé pour l'horodatage dans DynamoDB?

98

Je suis nouveau sur DynamoDB. Je souhaite créer une table qui utilise DeviceID comme clé de hachage, Timestamp comme clé de plage et certaines données.

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

En SQL, nous pouvons utiliser le type datetime pour Timestamp, mais dans DynamoDB il n'y en a pas.

  1. Quel type de données dois-je utiliser? Chaîne? Nombre?
    entrez la description de l'image ici

  2. Pour le type de données choisi, dans quel type de format d'horodatage dois-je écrire? Format ISO (par exemple: 2016-11-11T17: 21: 07.5272333Z) ou heure d'époque (par exemple: 1478943038816)?

  3. J'ai besoin de rechercher dans le tableau à travers une plage horaire, par exemple: 1/1/2015 10h00 au 31/12/2016 23h00

Dennis
la source
2
Nous utilisons un nombre au format / heure d'époque. Nous l'utilisons également pour les recherches par plage avec essentiellement un customer_id
George M Whitaker
Les types de données String et Number peuvent être utilisés. Chaîne lors du stockage au format ISO8601 et Nombre lors du stockage de l'heure d'époque. Plus d'infos ici: abhayachauhan.com/2017/12/…
Abhaya Chauhan
Le document officiel dit: «Vous pouvez utiliser le type de données chaîne pour représenter une date ou un horodatage. Une façon de le faire est d'utiliser des chaînes ISO 8601».
Hong
La réponse à partir de laquelle vous avez copié votre capture d'écran ( stackoverflow.com/a/27894543/1357094 ), répond à cette question - et cette question duplique en fait la question de la réponse en premier lieu: stackoverflow.com/questions/27894393/…
cellepo

Réponses:

83

Le type de données String doit être utilisé pour Date ou Timestamp.

Vous pouvez utiliser le type de données String pour représenter une date ou un horodatage. Une façon de procéder consiste à utiliser des chaînes ISO 8601, comme indiqué dans ces exemples:

15/02/2016

2015-12-21T17: 42: 34Z

20150311T122706Z

Type de données DynamoDB pour la date ou l'horodatage

Oui, les requêtes Range sont prises en charge lorsque la date est stockée sous forme de chaîne. L' ENTRE peut être utilisé sur FilterExpresssion. J'ai les éléments dans le résultat en utilisant les expressions de filtre ci-dessous.

FilterExpression sans temps: -

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

FilterExpression avec le temps: -

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

Valeurs de la base de données: -

Format 1 - avec fuseau horaire:

{"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 - sans fuseau horaire: -

{"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."}}}}}
notionquest
la source
Mais pouvez-vous effectuer des recherches de plage de dates lorsqu'elles sont stockées sous forme de valeurs de chaîne?
Mark B
@notionquest ya, pouvez-vous effectuer une recherche par plage de dates et d'heures avec String?
Dennis
54
Je ne vois pas comment vous êtes arrivé à "Le type de données chaîne doit être utilisé pour la date ou l'horodatage". La documentation indique également que vous pouvez également utiliser le type de données Nombre pour les dates via l'heure de l'époque. Pourquoi pensez-vous que String devrait être utilisé sur Number?
Roly
1
Les types de données String et Number peuvent être utilisés. Chaîne lors du stockage au format ISO8601 et Nombre lors du stockage de l'heure d'époque. Plus d'infos ici: abhayachauhan.com/2017/12/…
Abhaya Chauhan
1
Les nombres @roly devraient également fonctionner correctement, mais ils sont moins lisibles.
Matthew Bonig
22

Le type de données dépend de vos besoins.

Vous pouvez utiliser String en utilisant le format ISO ou Number en utilisant le format d'époque.

L'avantage du format ISO (String) est la lisibilité humaine, mais DynamoDB ne prend pas en charge Time To Live (TTL) pour ce format. Tous les filtres fonctionnent tels que «entre» et «plage» comme l'explique notionquest.

Time To Live (TTL) pour DynamoDB vous permet de définir quand les éléments d'une table expirent afin qu'ils puissent être automatiquement supprimés de la base de données.

L'avantage d'utiliser le format d'époque (nombre) est que vous pouvez utiliser la fonction TTL et tous les filtres.

TLDR;

Format d'époque (type numérique) - Peut utiliser le
format ISO Time To Live (type chaîne) - Ne peut pas utiliser Time To Live mais est plus lisible par l'homme

TheKnightCoder
la source
Les expressions de filtre peuvent être prises en charge par des nombres, mais les conditions clés basées sur une plage ne seraient prises en charge qu'avec des chaînes au format ISO
Rafael Almeida
@RafaelAlmeida, que voulez-vous dire? Et quelles sont vos sources?
Zachary Ryan Smith
1
@ZacharyRyanSmith Je me suis trompé - en effet, les attributs numériques fonctionnent comme des clés de tri et dans les conditions clés des filtres.
Rafael Almeida
2

Le type de données Number OU le type de données String

peut être utilisé pour la date ou l'horodatage - pas seulement la chaîne car la réponse acceptée à cette question se distingue par erreur tout en ignorant le nombre.

Vous pouvez utiliser le type de données numérique pour représenter une date ou un horodatage. Une façon de procéder consiste à utiliser l'heure de l'époque, le nombre de secondes depuis 00:00:00 UTC le 1er janvier 1970. Par exemple, l'heure de l'époque 1437136300 représente 12:31:40 UTC le 17 juillet 2015.

Pour plus d'informations, consultez http://en.wikipedia.org/wiki/Unix_time .

...

Vous pouvez utiliser le type de données String pour représenter une date ou un horodatage. Une façon de procéder consiste à utiliser des chaînes ISO 8601, comme indiqué dans ces exemples:

15/02/2016

2015-12-21T17: 42: 34Z

20150311T122706Z

Pour plus d'informations, voir http://en.wikipedia.org/wiki/ISO_8601 .

Type de données DynamoDB pour la date ou l'horodatage

cellepo
la source
1

pour que je puisse filtrer les résultats lors de l'envoi d'une requête de requête, j'ai utilisé le format d'époque pour DateTime, c'est plus efficace que d'utiliser une chaîne.

imaginez ces scénarios: les 31 derniers jours, les dernières 24 heures, ... encore une fois, tout est possible en utilisant le format de chaîne car il a également l' opérateur begin_with ( veuillez vérifier le 3ème exemple dans le lien ci-dessous sur le document AWS ) mais les valeurs numériques sont beaucoup plus efficaces en termes des performances lors du tri (comparaison) et du calcul.

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

il est facile de convertir la date-heure au format d'époque

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 )
Mohammad Khodabandeh
la source