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

99

Я новичок в 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 до 23.12.2016 23:00:00

Деннис
источник
1
stackoverflow.com/questions/27894393/…
Джордж М. Уитакер,
2
Мы используем число в формате времени / эпохи. Мы также используем его для поиска по диапазонам вместе с в основном customer_id
Джордж М. Уитакер,
Могут использоваться строковые и числовые типы данных. Строка при сохранении формата ISO8601 и Число при сохранении времени эпохи. Подробнее здесь: abhayachauhan.com/2017/12/…
Абхая Чаухан
В официальном документе говорится: «Вы можете использовать строковый тип данных для представления даты или метки времени. Один из способов сделать это - использовать строки ISO 8601».
Гонконг
Ответ, который вы скопировали из своего снимка экрана ( stackoverflow.com/a/27894543/1357094 ), отвечает на этот вопрос - и этот вопрос фактически дублирует указанный вопрос ответа в первую очередь: stackoverflow.com/questions/27894393/…
cellepo

Ответы:

82

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

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

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

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

Да, запросы Range поддерживаются, если дата хранится как String. МЕЖДУ может быть использован на 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."}}}}}
notionquest
источник
Но можно ли выполнять поиск по диапазону дат, если они хранятся как строковые значения?
Mark B
@notionquest да, вы можете выполнить поиск по дате и времени с помощью String?
Деннис
56
Я не понимаю, как вы пришли к «Строковый тип данных должен использоваться для даты или отметки времени». В документации также говорится, что вы также можете использовать числовой тип данных для дат через эпоху. Как вы думаете, почему String следует использовать вместо Number?
Roly
1
Могут использоваться строковые и числовые типы данных. Строка при сохранении формата ISO8601 и Число при сохранении времени эпохи. Подробнее здесь: abhayachauhan.com/2017/12/…
Абхая Чаухан
1
Номера @roly также должны работать нормально, но они менее читабельны.
Мэтью Бониг
23

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

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

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

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

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

TL; DR;

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

TheKnightCoder
источник
Выражения фильтра могут поддерживаться числами, но ключевые условия на основе диапазона будут поддерживаться только со строками в формате ISO
Рафаэль Алмейда,
@RafaelAlmeida, что ты имеешь в виду? А какие у вас источники?
Захари Райан Смит,
1
@ZacharyRyanSmith Я был неправ - действительно, числовые атрибуты работают как ключи сортировки и в ключевых условиях в фильтрах.
Рафаэль Алмейда,
2

Тип данных Number ИЛИ тип данных 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 для даты или отметки времени

виолончель
источник
1

чтобы я мог отфильтровать результаты при отправке запроса, я использовал формат эпохи для 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 )
Мохаммад Ходабандех
источник