Який тип даних слід використовувати для позначки часу в DynamoDB?


98

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

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

У SQL ми можемо використовувати тип часу і часу для Timestamp, але в DynamoDB такого немає.

  1. Який тип даних слід використовувати? Рядок? Кількість?
    введіть тут опис зображення

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

  3. Мені потрібно шукати таблицю протягом певного періоду часу, наприклад: 01.01.2015 10:00:00 до 31.12.2016 23:00:00



2
Ми використовуємо число в епосі часу / форматі. Ми використовуємо його для пошуку діапазону, а також, в основному, customer_id
George M Whitaker

Можна використовувати типи даних "рядок" і "число". Рядок при зберіганні формату ISO8601, а номер при зберіганні часу епохи. Більше інформації тут: abhayachauhan.com/2017/12/…
Chauhan

В офіційному документі сказано: "Ви можете використовувати тип даних рядка для представлення дати або позначки часу. Один із способів зробити це - використання рядків ISO 8601".
Гонконг,

Відповідь , який ви скопіювали свій скріншот ( stackoverflow.com/a/27894543/1357094 ), відповідає на це питання - і це питання на самому ділі дублікатами , що зазначене питання - відповідь в першу чергу: stackoverflow.com/questions/27894393 / ...
cellepo

Відповіді:


83

Тип даних Рядок повинна використовуватися для дати або Timestamp.

Ви можете використовувати тип даних String для представлення дати або позначки часу. Один із способів це зробити - це використання рядків ISO 8601, як показано в цих прикладах:

15.02.2016

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, а, ти можеш здійснити пошук за діапазоном дат і часу за допомогою рядка?
Денніс

54
Я не розумію, як ви дійшли до "Тип даних рядка слід використовувати для дати або позначки часу". У документах також сказано, що ви також можете використовувати тип даних Number для дат через епоху. Чому, на вашу думку, рядок слід використовувати над числом?
Ролі

1
Можна використовувати типи даних "рядок" і "число". Рядок при зберіганні формату ISO8601, а номер при зберіганні часу епохи. Більше інформації тут: abhayachauhan.com/2017/12/…
Chauhan

1
Номери @roly також повинні працювати нормально, але вони менш читабельні.
Matthew Bonig

22

Тип даних залежить від ваших вимог.

Ви можете використовувати String у форматі ISO або Number у форматі epoch.

Перевагою формату ISO (String) є людська читабельність, однак DynamoDB не підтримує Time To Live (TTL) для цього формату. Усі фільтри працюють, наприклад, "між" та "діапазоном", як пояснюється notionquest.

Час життя (TTL) для DynamoDB дозволяє визначити, коли закінчується термін дії елементів у таблиці, щоб їх можна було автоматично видалити з бази даних.

Перевага використання формату epoch (Number) полягає в тому, що ви можете використовувати функцію TTL та всі фільтри.

TLDR;

Формат епохи (тип числа) - може використовувати
формат часу до життя ISO (тип рядка) - не може використовувати час до життя, але є зручнішим для читання


Вирази фільтру можуть підтримуватися цифрами, але ключові умови на основі діапазону підтримуватимуться лише з рядками у форматі ISO
Рафаель Альмейда,

@RafaelAlmeida, що ти маєш на увазі? А які ваші джерела?
Захарі Райан Сміт,

1
@ZacharyRyanSmith я помилився - справді, атрибути Number працюють як ключі сортування та в Ключових умовах у фільтрах.
Рафаель Алмейда

2

Тип даних Число АБО тип даних Рядок

може використовуватися для дати або позначки часу - а не просто рядка, оскільки прийнята відповідь на це запитання неправильно виділяється, ігноруючи номер.

Тип даних числа можна використовувати для подання дати або позначки часу. Один із способів це зробити - використання часу епохи - кількості секунд з 00:00:00 UTC 1 січня 1970 року. Наприклад, час епохи 1437136300 являє собою 17:31:40 UTC 17 липня 2015 року.

Для отримання додаткової інформації див. Http://en.wikipedia.org/wiki/Unix_time .

...

Ви можете використовувати тип даних String для представлення дати або позначки часу. Один із способів це зробити - це використання рядків ISO 8601, як показано в цих прикладах:

15.02.2016

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 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.