DynamoDB'de zaman damgası için hangi veri türü kullanılmalıdır?


99

DynamoDB'de yeniyim. Hash anahtarı olarak DeviceID, aralık anahtarı olarak Timestamp ve bazı veriler kullanan bir tablo oluşturmak istiyorum.

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

SQL'de Timestamp için datetime tipini kullanabiliriz, ancak DynamoDB'de hiçbiri yoktur.

  1. Hangi veri türünü kullanmalıyım? İp mi? Numara?
    görüntü açıklamasını buraya girin

  2. Seçilen veri türü için ne tür bir zaman damgası biçiminde yazmalıyım? ISO formatı (ör. 2016-11-11T17: 21: 07.5272333Z) veya dönem zamanı (ör. 1478943038816)?

  3. Tabloda belirli bir zaman aralığında arama yapmam gerekiyor, örneğin: 1/1/2015 10:00:00 - 31/12/2016 11:00:00



2
Epoch time / formatta bir sayı kullanıyoruz. Bunu aralık aramalarında ve temelde bir customer_id
George M Whitaker

Dize ve Sayı veri türleri kullanılabilir. ISO8601 biçimini depolarken dize ve Epoch zamanını depolarken Sayı. Daha fazla bilgi burada: abhayachauhan.com/2017/12/…
Abhaya Chauhan

Resmi doc "Bir tarih veya ISO 8601 dizeleri kullanarak bir zaman damgası. Bir bunu yapmak için bir yol olduğunu temsil etmek dize veri türü kullanabilirsiniz" diyor.
Hong

Eğer (adresinin ekran görüntüsü kopyalanan Cevap stackoverflow.com/a/27894543/1357094 ), bu soru cevap - ve bu soru ilk etapta Yanıtın Soru söyledi aslında çiftleri: stackoverflow.com/questions/27894393/...
cellepo

Yanıtlar:


82

Dize veri türü tarih veya zaman damgası için kullanılmalıdır.

Bir tarihi veya zaman damgasını temsil etmek için String veri türünü kullanabilirsiniz. Bunu yapmanın bir yolu, aşağıdaki örneklerde gösterildiği gibi ISO 8601 dizelerini kullanmaktır:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Tarih veya Zaman Damgası için DynamoDB Veri türü

Evet, tarih Dize olarak saklandığında Aralık sorguları desteklenir. ARASINDAKİ FilterExpresssion kullanılabilir. Aşağıdaki filtre ifadelerini kullanarak sonuçtaki öğeleri aldım.

Zamansız FilterExpression: -

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

Zamanla 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"
    }

Veritabanı Değerleri: -

Biçim 1 - saat dilimiyle:

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

Biçim 2 - saat dilimi olmadan: -

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

Ancak, Dize değerleri olarak depolandıklarında tarih aralığı aramaları yapabilir misiniz?
Mark B

@notionquest ya, String ile tarih ve saat aralığı araması yapabilir misiniz?
Dennis

56
Eğer "Dize veri türü nasıl ulaştığını görmüyorum gerekir tarih veya zaman damgası kullanılacak". Dokümanlar ayrıca, Epoch time aracılığıyla tarihler için Number veri türünü kullanabileceğinizi de söylüyor. Neden String'in Sayı yerine kullanılması gerektiğini düşünüyorsunuz ?
Roly

1
Dize ve Sayı veri türleri kullanılabilir. ISO8601 biçimini depolarken dize ve Epoch zamanını depolarken Sayı. Daha fazla bilgi burada: abhayachauhan.com/2017/12/…
Abhaya Chauhan

1
@roly sayıları da iyi çalışmalı, ancak daha az okunabilir.
Matthew Bonig

23

Veri türü gereksinimlerinize bağlıdır.

Dize'yi ISO biçimini veya Sayı biçimini kullanarak epoch biçimini kullanabilirsiniz.

ISO formatının (String) avantajı, insan tarafından okunabilirliktir, ancak DynamoDB bu format için Yaşam Süresi'ni (TTL) desteklemez. Tüm filtreler, fikir sorusu tarafından açıklandığı gibi 'arasında' ve 'aralık' gibi çalışır.

DynamoDB için Geçerlilik Süresi (TTL) , bir tablodaki öğelerin ne zaman sona ereceğini tanımlamanıza olanak tanır, böylece bunlar veritabanından otomatik olarak silinebilir.

Epoch formatını (Sayı) kullanmanın avantajı, TTL özelliğini ve tüm filtreleri kullanabilmenizdir.

TLDR;

Epoch biçimi (Sayı türü) - Yaşama Süresi
ISO biçimini kullanabilir (Dize türü) - Yaşama Süresi kullanılamaz, ancak daha okunabilir


Filtre İfadeleri sayılarla desteklenebilir, ancak menzile dayalı Temel Koşullar yalnızca ISO biçimindeki dizelerle desteklenir
Rafael Almeida

@RafaelAl Almeida, ne demek istiyorsun? Ve kaynaklarınız neler?
Zachary Ryan Smith

1
@ZacharyRyanSmith Yanılıyordum - aslında, Sayı öznitelikleri filtrelerde sıralama anahtarları olarak ve Anahtar Koşullarda çalışıyor.
Rafael Almeida

2

Number veri türü VEYA String veri türü

Tarih veya Zaman Damgası için kullanılabilir - bu Sorudaki Kabul Edilen Cevap Sayı yok sayılırken yanlış bir şekilde seçildiği için sadece Dize değil .

Bir tarihi veya zaman damgasını temsil etmek için sayı veri türünü kullanabilirsiniz. Bunu yapmanın bir yolu, çağ zamanını kullanmaktır — 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısı. Örneğin, 1437136300, 17 Temmuz 2015'te 12:31:40 UTC'yi temsil eder.

Daha fazla bilgi için http://en.wikipedia.org/wiki/Unix_time adresine bakın .

...

Bir tarihi veya zaman damgasını temsil etmek için String veri türünü kullanabilirsiniz. Bunu yapmanın bir yolu, aşağıdaki örneklerde gösterildiği gibi ISO 8601 dizelerini kullanmaktır:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Daha fazla bilgi için http://en.wikipedia.org/wiki/ISO_8601 adresine bakın .

Tarih veya Zaman Damgası için DynamoDB Veri türü


1

bir sorgu isteği gönderirken sonuçları filtreleyebilmem için DateTime için epoch formatını kullandım, string kullanmaktan daha verimli.

Şu senaryoları hayal edin: son 31 gün, son 24 saat, ... yine de işleci ile başlar ( lütfen AWS belgesindeki aşağıdaki bağlantıdaki 3. örneği kontrol edin ), ancak sayısal değerler açısından çok daha etkilidir. sıralama (karşılaştırma) ve hesaplama sırasındaki performans.

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

tarih-saati çağ formatına dönüştürmek kolaydır

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 )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.