Какой тип данных следует использовать для отметки времени в DynamoDB?

Я новичок в DynamoDB. Я хочу создать таблицу, в которой используется DeviceID в качестве хеш-ключа, Timestamp в качестве ключа диапазона и некоторые данные.

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

В SQL мы можем использовать тип datetime для Timestamp, но в DynamoDB его нет.

  1. Какой тип данных я должен использовать? Нить? Номер?
     введите описание изображения здесь

  2. В какой формат метки времени следует писать для выбранного типа данных? Формат ISO (например, 2016-11-11T17: 21: 07.5272333Z) или время эпохи (например: 1478943038816)?

  3. Мне нужно выполнить поиск в таблице в течение определенного периода времени, например: 01.01.2015 10:00:00 до 11:00:00 31/12/2016


person Dennis    schedule 12.11.2016    source источник
comment
stackoverflow.com/ questions / 27894393 /   -  person George M Whitaker    schedule 12.11.2016
comment
Мы используем число в формате времени / эпохе. Мы также используем его для поиска по диапазону вместе, в основном, с customer_id.   -  person George M Whitaker    schedule 12.11.2016
comment
Могут использоваться строковые и числовые типы данных. Строка при сохранении формата ISO8601 и Число при сохранении времени эпохи. Дополнительная информация здесь: abhayachauhan.com / 2017/12 /   -  person Abhaya Chauhan    schedule 21.12.2017
comment
В официальном документе говорится, что вы можете использовать строку тип данных для представления даты или отметки времени. Один из способов сделать это - использовать строки ISO 8601.   -  person Hong    schedule 05.11.2019
comment
Ответ, из которого вы скопировали свой снимок экрана (stackoverflow.com/a/27894543/1357094), отвечает на этот вопрос - и это Вопрос фактически дублирует упомянутый вопрос ответа в первую очередь: stackoverflow.com/questions/27894393/   -  person cellepo    schedule 16.11.2019
comment
Возможный дубликат Можно ли сохранить дату и время в DynamoDB?   -  person cellepo    schedule 16.11.2019


Ответы (4)


Тип данных String следует использовать для даты или отметки времени.

Вы можете использовать тип данных String для представления даты или отметки времени. Один из способов сделать это - использовать строки ISO 8601, как показано в следующих примерах:

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

Тип данных DynamoDB для даты или отметки времени

Да, запросы диапазона поддерживаются, если дата хранится как строка. BETWEEN можно использовать в FilterExpresssion. Я получил элементы в результате, используя приведенные ниже выражения фильтра.

FilterExpression без времени: -

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

FilterExpression со временем: -

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

Значения в базе данных: -

Формат 1 - с часовым поясом:

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

Формат 2 - без часового пояса: -

{"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."}}}}}
person notionquest    schedule 12.11.2016
comment
Но можно ли выполнять поиск по диапазону дат, если они хранятся как строковые значения? - person Mark B; 12.11.2016
comment
@notionquest да, вы можете выполнить поиск по дате и времени с помощью String? - person Dennis; 12.11.2016
comment
@MarkB - запросы диапазона поддерживаются, если дата хранится как строка. Я обновил ответы примером. Оператор Between может использоваться для фильтрации данных. - person notionquest; 12.11.2016
comment
Строка даты может быть отсортирована при сохранении в формате ISO 8601, поскольку 8601 был разработан для буквенно-цифровой сортировки (в пределах одного часового пояса). - person wprl; 26.05.2017
comment
Я не понимаю, как вы пришли к тому, что тип данных String следует использовать для даты или отметки времени. В документации также говорится, что вы также можете использовать тип данных Number для дат через эпоху. Как вы думаете, почему String следует использовать вместо Number? - person Roly; 10.07.2017
comment
Это хорошо, но теперь есть аннотации @DynamoDBTypeConvertedEpochDate и @DynamoDBTypeConvertedTimestamp, поэтому было бы неплохо узнать о них больше и увидеть их в действии. Я думаю, что авторы DynamoDB осознали, что хранение java.util.Date в виде String раздражает, поскольку добавляет еще один уровень перевода в и из базы данных, который теоретически должен обрабатываться самой базой данных, как это тривиально может быть. - person anon58192932; 30.08.2017
comment
Числа @roly также должны работать нормально, но они менее читабельны. - person Matthew Bonig; 11.09.2018
comment
Столбец с именем createdate должен хранить только дату, а не дату и время. Если вы хотите сохранить дату и время, используйте createdatetime (чтобы соответствовать вашему шаблону) или, лучше, created_at (и created_on только для дат). - person TiggerToo; 18.04.2019
comment
@TiggerТоже вы что-то имеете в виду по аналогии с колонкой? В таблицах DynamoDB нет столбцов, поскольку DynamoDB - это NoSQL. - person cellepo; 15.11.2019
comment
@Roly прав - и я сделал здесь еще один ответ, чтобы прояснить, что можно использовать String OR Number (поскольку принятие этого ответа наполовину обманчиво, если сосредоточиться на String). - person cellepo; 16.11.2019

Тип данных зависит от ваших требований.

Вы можете использовать String в формате ISO или Number в формате эпохи.

Преимущество формата ISO (String) - удобочитаемость, однако DynamoDB не поддерживает время жизни (TTL) для этого формата. Все фильтры работают как «между» и «диапазон», как объясняется в notionquest.

Время жизни (TTL) для DynamoDB позволяет определить, когда истекает срок действия элементов в таблице, чтобы их можно было автоматически удалить из базы данных.

Преимущество использования формата эпохи (числа) заключается в том, что вы можете использовать функцию TTL и все фильтры.

TL; DR;

Формат эпохи (числовой тип) - можно использовать формат Time To Live
ISO (строковый тип) - нельзя использовать Time To Live, но он более удобочитаем.

person TheKnightCoder    schedule 14.01.2019
comment
Выражения фильтра могут поддерживаться числами, но ключевые условия на основе диапазона будут поддерживаться только со строками в формате ISO. - person Rafael Almeida; 29.06.2020
comment
@RafaelAlmeida, что ты имеешь в виду? А какие у вас источники? - person Zachary Ryan Smith; 25.08.2020
comment
@ZacharyRyanSmith Я был неправ - действительно, числовые атрибуты работают как ключи сортировки и в ключевых условиях в фильтрах. - person Rafael Almeida; 01.11.2020

чтобы я мог отфильтровать результаты при отправке запроса, я использовал формат эпохи для DateTime, это более эффективно, чем использование строки.

представьте себе эти сценарии: последние 31 день, последние 24 часа, ... снова все возможно с использованием строкового формата, поскольку он также имеет оператор begin_with (проверьте 3-й пример в ссылке ниже в документе AWS ), но числовые значения намного эффективнее с точки зрения производительности при сортировке (сравнении) и вычислении.

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

легко преобразовать дату и время в формат эпохи

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 )
person Mohammad Khodabandeh    schedule 25.08.2020

Тип данных Number ИЛИ тип данных String

может использоваться для даты или отметки времени - не только String, поскольку принятый ответ на этот вопрос неправильно выделяется при игнорировании числа.

Вы можете использовать числовой тип данных для представления даты или отметки времени. Один из способов сделать это - использовать время эпохи - количество секунд с 00:00:00 UTC 1 января 1970 года. Например, время 1437136300 представляет 12:31:40 UTC 17 июля 2015 года.

Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Unix_time.

...

Вы можете использовать тип данных String для представления даты или отметки времени. Один из способов сделать это - использовать строки ISO 8601, как показано в следующих примерах:

2016-02-15

2015-12-21T17:42:34Z

20150311T122706Z

Для получения дополнительной информации см. http://en.wikipedia.org/wiki/ISO_8601.

Тип данных DynamoDB для даты или отметки времени >

person cellepo    schedule 15.11.2019