¿Qué tipo de datos se debe usar para la marca de tiempo en DynamoDB?

99

Soy nuevo en DynamoDB. Deseo crear una tabla que use DeviceID como clave hash, Timestamp como clave de rango y algunos datos.

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

En SQL, podemos usar el tipo de fecha y hora para la marca de tiempo, pero en DynamoDB no hay ninguno.

  1. ¿Qué tipo de datos debo utilizar? ¿Cuerda? ¿Número?
    ingrese la descripción de la imagen aquí

  2. Para el tipo de datos elegido, ¿en qué tipo de formato de marca de tiempo debo escribir? ¿Formato ISO (por ejemplo: 2016-11-11T17: 21: 07.5272333Z) o tiempo de época (por ejemplo: 1478943038816)?

  3. Necesito buscar en la tabla en un rango de tiempo, por ejemplo: 1/1/2015 10:00:00 am hasta 31/12/2016 11:00:00 pm

Dennis
fuente
2
Usamos un número en formato / tiempo de época. También lo usamos para búsquedas de rango junto con básicamente un customer_id
George M Whitaker
Se pueden utilizar los tipos de datos String y Number. Cadena al almacenar el formato ISO8601 y Número al almacenar la época. Más información aquí: abhayachauhan.com/2017/12/…
Abhaya Chauhan
El documento oficial dice: "Puede utilizar el tipo de datos de cadena para representar una fecha o una marca de tiempo. Una forma de hacerlo es utilizando cadenas ISO 8601".
Hong
La respuesta de la que copió su captura de pantalla ( stackoverflow.com/a/27894543/1357094 ) responde a esta pregunta, y esta pregunta en realidad duplica la pregunta de la respuesta en primer lugar: stackoverflow.com/questions/27894393/…
cellepo

Respuestas:

82

El tipo de datos String debe usarse para Fecha o Marca de tiempo.

Puede utilizar el tipo de datos String para representar una fecha o una marca de tiempo. Una forma de hacer esto es usando cadenas ISO 8601, como se muestra en estos ejemplos:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Tipo de datos de DynamoDB para fecha o marca de tiempo

Sí, las consultas de rango son compatibles cuando la fecha se almacena como cadena. El ENTRE se puede utilizar en FilterExpresssion. Obtuve los elementos en el resultado usando las siguientes expresiones de filtro.

FilterExpression sin tiempo: -

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

FilterExpression con tiempo: -

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

Valores de la base de datos: -

Formato 1 - con zona horaria:

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

Formato 2 - sin zona horaria: -

{"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."}}}}}
nocion
fuente
Pero, ¿puede realizar búsquedas por rango de fechas cuando se almacenan como valores de cadena?
Mark B
@notionquest ya, ¿puedes hacer una búsqueda de rango de fecha y hora con String?
Dennis
56
No veo cómo llegó a "El tipo de datos de cadena debe usarse para la fecha o la marca de tiempo". Los documentos también dicen que también puede usar el tipo de datos numérico para fechas a través del tiempo de época. ¿Por qué crees que se debería usar String sobre Number?
Roly
1
Se pueden utilizar los tipos de datos String y Number. Cadena al almacenar el formato ISO8601 y Número al almacenar la época. Más información aquí: abhayachauhan.com/2017/12/…
Abhaya Chauhan
1
Los números de @roly también deberían funcionar bien, pero son menos legibles.
Matthew Bonig
23

El tipo de datos depende de sus requisitos.

Puede usar String usando formato ISO o Number usando formato de época.

La ventaja del formato ISO (String) es la legibilidad humana; sin embargo, DynamoDB no es compatible con Time To Live (TTL) para este formato. Todos los filtros funcionan como 'entre' y 'rango' como se explica en notionquest.

Time To Live (TTL) para DynamoDB le permite definir cuándo caducan los elementos de una tabla para que puedan eliminarse automáticamente de la base de datos.

La ventaja de usar el formato de época (Número) es que puede usar la función TTL y todos los filtros.

TLDR;

Formato Epoch (tipo de número): puede usar el
formato ISO Time To Live (tipo String): no puede usar Time To Live, pero es más legible por humanos

TheKnightCoder
fuente
Las expresiones de filtro pueden ser compatibles con números, pero las condiciones clave basadas en rangos solo serían compatibles con cadenas en formato ISO
Rafael Almeida
@RafaelAlmeida, ¿qué quieres decir? ¿Y cuáles son tus fuentes?
Zachary Ryan Smith
1
@ZacharyRyanSmith Estaba equivocado; de hecho, los atributos numéricos funcionan como claves de clasificación y en condiciones clave en los filtros.
Rafael Almeida
2

El tipo de datos Número O el tipo de datos Cadena

se puede usar para la fecha o la marca de tiempo, no solo la cadena, ya que la respuesta aceptada en esta pregunta se identifica incorrectamente mientras se ignora el número.

Puede utilizar el tipo de datos numérico para representar una fecha o una marca de tiempo. Una forma de hacerlo es utilizando el tiempo de época: el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. Por ejemplo, el tiempo de época 1437136300 representa las 12:31:40 PM UTC del 17 de julio de 2015.

Para obtener más información, consulte http://en.wikipedia.org/wiki/Unix_time .

...

Puede utilizar el tipo de datos String para representar una fecha o una marca de tiempo. Una forma de hacer esto es utilizando cadenas ISO 8601, como se muestra en estos ejemplos:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Para obtener más información, consulte http://en.wikipedia.org/wiki/ISO_8601 .

Tipo de datos de DynamoDB para fecha o marca de tiempo

cellepo
fuente
1

para poder filtrar los resultados al enviar una solicitud de consulta, usé el formato de época para DateTime, es más eficiente que usar una cadena.

imagine estos escenarios: últimos 31 días, últimas 24 horas, ... nuevamente, todo es posible usando el formato de cadena, ya que también tiene el operador starts_with ( verifique el tercer ejemplo en el enlace a continuación en el documento de AWS ) pero los valores numéricos son mucho más eficientes en términos de rendimiento mientras clasifica (compara) y calcula.

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

es fácil convertir la fecha y la hora al formato de época

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);

Pitón

import time
epoch = time.time()
 
# converting back to date-time
initial_date = time.gmtime(epoch )
Mohammad Khodabandeh
fuente