Que tipo de dados deve ser usado para carimbo de data / hora no DynamoDB?

102

Eu sou novo no DynamoDB. Desejo criar uma tabela que usa DeviceID como a chave hash, Timestamp como minha chave de intervalo e alguns dados.

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

Em SQL, podemos usar o tipo datetime para Timestamp, mas no DynamoDB não há nenhum.

  1. Que tipo de dados devo usar? Corda? Número?
    insira a descrição da imagem aqui

  2. Para o tipo de dados escolhido, em que tipo de formato de carimbo de data / hora devo escrever? Formato ISO (por exemplo: 2016-11-11T17: 21: 07.5272333Z) ou tempo de época (por exemplo: 1478943038816)?

  3. Preciso pesquisar na tabela em um intervalo de tempo, por exemplo: 01/01/2015 10:00:00 até 31/12/2016 23:00:00

Dennis
fonte
2
Usamos um número no formato / hora da época. Também o usamos para pesquisas de intervalo, juntamente com basicamente um customer_id
George M Whitaker
Os tipos de dados String e Number podem ser usados. String ao armazenar o formato ISO8601 e Número ao armazenar a hora da época. Mais informações aqui: abhayachauhan.com/2017/12/…
Abhaya Chauhan
O documento oficial diz: "Você pode usar o tipo de dados string para representar uma data ou carimbo de data / hora. Uma maneira de fazer isso é usando strings ISO 8601".
Hong
A resposta da qual você copiou sua captura de tela ( stackoverflow.com/a/27894543/1357094 ) responde a esta pergunta - e esta pergunta realmente duplica aquela pergunta da resposta em primeiro lugar: stackoverflow.com/questions/27894393/…
cellepo

Respostas:

85

O tipo de dados String deve ser usado para Data ou Timestamp.

Você pode usar o tipo de dados String para representar uma data ou um carimbo de data / hora. Uma maneira de fazer isso é usando strings ISO 8601, conforme mostrado nestes exemplos:

15/02/2016

2015-12-21T17: 42: 34Z

20150311T122706Z

Tipo de dados DynamoDB para data ou carimbo de data / hora

Sim, as consultas de intervalo são suportadas quando a data é armazenada como String. O BETWEEN pode ser usado em FilterExpresssion. Peguei os itens no resultado usando as expressões de filtro abaixo.

FilterExpression sem hora: -

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

FilterExpression com o tempo: -

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 do banco de dados: -

Formato 1 - com fuso horário:

{"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 - sem fuso horário: -

{"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."}}}}}
questão de noção
fonte
Mas você pode fazer pesquisas de intervalo de datas quando eles são armazenados como valores de String?
Mark B
@notionquest ya, você pode fazer uma pesquisa de intervalo de data e hora com String?
Dennis
57
Não vejo como você chegou a "Tipo de dados String deve ser usado para Data ou Timestamp". Os documentos também dizem que você também pode usar o tipo de dados Número para datas por período. Por que você acha que String deve ser usada em vez de Number?
Roly de
1
Os tipos de dados String e Number podem ser usados. String ao armazenar o formato ISO8601 e Número ao armazenar a hora da época. Mais informações aqui: abhayachauhan.com/2017/12/…
Abhaya Chauhan
2
Números @roly também devem funcionar bem, mas são menos legíveis.
Matthew Bonig
27

O tipo de dados depende de seus requisitos.

Você pode usar String usando o formato ISO ou Número usando o formato de época.

A vantagem do formato ISO (String) é a legibilidade humana; entretanto, o DynamoDB não oferece suporte ao Time To Live (TTL) para este formato. Todos os filtros funcionam como 'entre' e 'intervalo', conforme explicado por notionquest.

Time To Live (TTL) para DynamoDB permite que você defina quando os itens em uma tabela expiram para que eles possam ser automaticamente excluídos do banco de dados.

A vantagem de usar o formato de época (Número) é que você pode usar o recurso TTL e todos os filtros.

TLDR;

Formato de época (tipo de número) - Pode usar o
formato ISO Time To Live (tipo String) - Não é possível usar Time To Live, mas é mais legível por humanos

TheKnightCoder
fonte
As expressões de filtro podem ser suportadas por números, mas as condições-chave baseadas em intervalo só seriam suportadas com strings no formato ISO
Rafael Almeida
@RafaelAlmeida, o que você quer dizer? E quais são suas fontes?
Zachary Ryan Smith
1
@ZacharyRyanSmith Eu estava errado - na verdade, os atributos de número funcionam como chaves de classificação e em condições-chave em filtros.
Rafael Almeida
2

O tipo de dados Number OU o tipo de dados String

pode ser usado para Data ou Timestamp - não apenas String, já que a Resposta Aceita nesta Pergunta destaca incorretamente enquanto ignora o Número.

Você pode usar o tipo de dados de número para representar uma data ou um carimbo de data / hora. Uma maneira de fazer isso é usando a hora da época - o número de segundos desde 00:00:00 UTC em 1º de janeiro de 1970. Por exemplo, a hora da época 1437136300 representa 12:31:40 PM UTC de 17 de julho de 2015.

Para obter mais informações, consulte http://en.wikipedia.org/wiki/Unix_time .

...

Você pode usar o tipo de dados String para representar uma data ou um carimbo de data / hora. Uma maneira de fazer isso é usando strings ISO 8601, conforme mostrado nestes exemplos:

15/02/2016

2015-12-21T17: 42: 34Z

20150311T122706Z

Para obter mais informações, consulte http://en.wikipedia.org/wiki/ISO_8601 .

Tipo de dados DynamoDB para data ou carimbo de data / hora

Cellepo
fonte
1

para que eu possa filtrar os resultados ao enviar uma solicitação de consulta, usei o formato de época para DateTime, é mais eficiente do que usar string.

imagine estes cenários: últimos 31 dias, últimas 24 horas, ... novamente, tudo é possível usando o formato de string, já que também tem o operador começa_com ( verifique o terceiro exemplo no link abaixo no documento AWS ), mas os valores numéricos são muito mais eficientes em termos de desempenho durante a classificação (comparação) e cálculo.

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

é fácil converter data-hora em formato de época

Javascript:

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

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

C #

Pitão

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