Я новичок в DynamoDB. Я хочу создать таблицу, в которой используется DeviceID в качестве хэш-ключа, Timestamp в качестве ключа диапазона и некоторые данные.
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
В SQL мы можем использовать тип datetime для Timestamp, но в DynamoDB его нет.
Какой формат метки времени мне следует использовать для выбранного типа данных? Формат ISO (например: 2016-11-11T17: 21: 07.5272333Z) или время эпохи (например: 1478943038816)?
Мне нужно выполнить поиск в таблице через диапазон времени, например: 01.01.2015 10:00:00 до 23.12.2016 23:00:00
Ответы:
Тип данных String следует использовать для даты или отметки времени.
Тип данных DynamoDB для даты или отметки времени
Да, запросы Range поддерживаются, если дата хранится как String. МЕЖДУ может быть использован на FilterExpresssion. Я получил элементы в результате, используя приведенные ниже выражения фильтра.
FilterExpression без времени: -
FilterExpression со временем: -
Значения базы данных: -
Формат 1 - с часовым поясом:
Формат 2 - без часового пояса: -
источник
Тип данных зависит от ваших требований.
Вы можете использовать String в формате ISO или Number в формате эпохи.
Преимущество формата ISO (String) - удобочитаемость, однако DynamoDB не поддерживает время жизни (TTL) для этого формата. Все фильтры работают как «между» и «диапазон», как объясняется в notionquest.
Преимущество использования формата эпохи (числа) заключается в том, что вы можете использовать функцию TTL и все фильтры.
TL; DR;
Формат эпохи (числовой тип) - можно использовать
формат ISO Time To Live (тип String) - нельзя использовать Time To Live, но он более удобочитаем.
источник
Тип данных Number ИЛИ тип данных String
может использоваться для даты или метки времени, а не только для строки, поскольку принятый ответ на этот вопрос неправильно выделяется при игнорировании числа.
Тип данных DynamoDB для даты или отметки времени
источник
чтобы я мог отфильтровать результаты при отправке запроса, я использовал формат эпохи для 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 )
источник