Jenis data apa yang harus digunakan untuk stempel waktu di DynamoDB?

99

Saya baru mengenal DynamoDB. Saya ingin membuat tabel yang menggunakan DeviceID sebagai kunci hash, Stempel waktu sebagai kunci jangkauan saya dan beberapa data.

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

Di SQL, kita bisa menggunakan tipe datetime untuk Timestamp, tetapi di DynamoDB tidak ada.

  1. Tipe data apa yang harus saya gunakan? Tali? Jumlah?
    masukkan deskripsi gambar di sini

  2. Untuk tipe data yang dipilih, format stempel waktu seperti apa yang harus saya tulis? Format ISO (misalnya: 2016-11-11T17: 21: 07.5272333Z) atau waktu epoch (misalnya: 1478943038816)?

  3. Saya perlu mencari melalui tabel melalui rentang waktu, misalnya: 1/1/2015 10:00:00 hingga 31/12/2016 11:00:00

Dennis
sumber
2
Kami menggunakan angka dalam format waktu / waktu. Kami menggunakannya untuk penelusuran rentang serta pada dasarnya id_pelanggan
George M Whitaker
Tipe data String dan Number dapat digunakan. String saat menyimpan format ISO8601, dan Angka saat menyimpan waktu Epoch. Info lebih lanjut di sini: abhayachauhan.com/2017/12/…
Abhaya Chauhan
Dokumen resmi mengatakan, "Anda dapat menggunakan tipe data string untuk mewakili tanggal atau stempel waktu. Salah satu cara untuk melakukannya adalah dengan menggunakan string ISO 8601".
Hong
Jawaban yang Anda salin dari tangkapan layar Anda ( stackoverflow.com/a/27894543/1357094 ), menjawab Pertanyaan ini - dan Pertanyaan ini sebenarnya menduplikasi yang mengatakan Pertanyaan Jawaban di tempat pertama: stackoverflow.com/questions/27894393/…
cellepo

Jawaban:

82

The String tipe data harus digunakan untuk Tanggal atau Timestamp.

Anda dapat menggunakan tipe data String untuk mewakili tanggal atau stempel waktu. Salah satu cara untuk melakukannya adalah dengan menggunakan string ISO 8601, seperti yang ditunjukkan dalam contoh berikut:

2016-02-15

21-12-2015T17: 42: 34Z

20150311T122706Z

Jenis Data DynamoDB untuk Tanggal atau Stempel Waktu

Ya, kueri Rentang didukung saat tanggal disimpan sebagai String. The ANTARA dapat digunakan pada FilterExpresssion. Saya sudah mendapatkan item dalam hasil menggunakan ekspresi filter di bawah ini.

FilterExpression tanpa waktu: -

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

FilterExpression dengan waktu: -

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

Nilai Database: -

Format 1 - dengan zona waktu:

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

Format 2 - tanpa zona waktu: -

{"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
sumber
Tetapi dapatkah Anda melakukan penelusuran rentang tanggal saat disimpan sebagai nilai String?
Mark B
@notionquest ya, bisakah Anda melakukan pencarian rentang tanggal & waktu dengan String?
Dennis
56
Saya tidak mengerti bagaimana Anda sampai di "Tipe data string harus digunakan untuk Tanggal atau Stempel Waktu". Dokumen juga mengatakan Anda juga dapat menggunakan tipe data Angka untuk tanggal melalui waktu epoch. Menurut Anda mengapa String harus digunakan di atas Angka?
Roly
1
Tipe data String dan Number dapat digunakan. String saat menyimpan format ISO8601, dan Angka saat menyimpan waktu Epoch. Info lebih lanjut di sini: abhayachauhan.com/2017/12/…
Abhaya Chauhan
1
@roly numbers juga seharusnya berfungsi dengan baik tetapi kurang dapat dibaca.
Matthew Bonig
23

Jenis data tergantung pada kebutuhan Anda.

Anda dapat menggunakan String menggunakan format ISO atau Angka menggunakan format epoch.

Keuntungan dari format ISO (String) adalah keterbacaan manusia namun DynamoDB tidak mendukung Time To Live (TTL) untuk format ini. Semua filter bekerja seperti 'antara' dan 'rentang' seperti yang dijelaskan oleh notionquest.

Time To Live (TTL) untuk DynamoDB memungkinkan Anda menentukan kapan item dalam tabel kedaluwarsa sehingga dapat dihapus secara otomatis dari database.

Keuntungan menggunakan format epoch (Number) adalah Anda dapat menggunakan fitur TTL dan semua filter.

TLDR;

Format Epoch (Tipe angka) - Dapat menggunakan
format Time To Live ISO (tipe string) - Tidak dapat menggunakan Time To Live tetapi lebih dapat dibaca manusia

TheKnightCoder
sumber
Ekspresi Filter mungkin didukung oleh angka, tetapi Ketentuan Utama berbasis rentang hanya akan didukung dengan string dalam format ISO
Rafael Almeida
@RafaelAlmeida maksudnya apa? Dan apa sumber Anda?
Zachary Ryan Smith
1
@ZacharyRyanSmith Saya salah - memang, atribut Angka berfungsi sebagai kunci pengurutan dan dalam Kondisi Utama di filter.
Rafael Almeida
2

Tipe data Angka ATAU tipe data String

dapat digunakan untuk Tanggal atau Stempel Waktu - tidak hanya String sebagai Jawaban yang Diterima pada Pertanyaan ini salah memilih sambil mengabaikan Nomor.

Anda dapat menggunakan tipe data angka untuk mewakili tanggal atau stempel waktu. Salah satu cara untuk melakukannya adalah dengan menggunakan waktu epoch — jumlah detik sejak 00:00:00 UTC pada 1 Januari 1970. Misalnya, waktu epoch 1437136300 mewakili 12:31:40 PM UTC pada 17 Juli 2015.

Untuk informasi lebih lanjut, lihat http://en.wikipedia.org/wiki/Unix_time .

...

Anda dapat menggunakan tipe data String untuk mewakili tanggal atau stempel waktu. Salah satu cara untuk melakukannya adalah dengan menggunakan string ISO 8601, seperti yang ditunjukkan dalam contoh berikut:

2016-02-15

21-12-2015T17: 42: 34Z

20150311T122706Z

Untuk informasi lebih lanjut, lihat http://en.wikipedia.org/wiki/ISO_8601 .

Jenis Data DynamoDB untuk Tanggal atau Stempel Waktu

cellepo
sumber
1

bagi saya untuk dapat memfilter hasil saat mengirim permintaan kueri, saya menggunakan format epoch untuk DateTime, ini lebih efisien daripada menggunakan string.

bayangkan skenario ini: 31 hari terakhir, 24 jam terakhir, ... sekali lagi semua dimungkinkan menggunakan format string karena ini juga memiliki operator begin_with ( lihat contoh ke-3 di tautan di bawah di dokumen AWS ) tetapi nilai numerik jauh lebih efisien dalam hal kinerja saat menyortir (membandingkan) & perhitungan.

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

mudah untuk mengubah format tanggal-waktu ke masa

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 )
Mohammad Khodabandeh
sumber