저는 DynamoDB를 처음 사용합니다. DeviceID를 해시 키로, Timestamp를 범위 키로 사용하고 일부 데이터를 사용하는 테이블을 만들고 싶습니다.
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
SQL에서는 Timestamp에 datetime 유형을 사용할 수 있지만 DynamoDB에는 없습니다.
저는 DynamoDB를 처음 사용합니다. DeviceID를 해시 키로, Timestamp를 범위 키로 사용하고 일부 데이터를 사용하는 테이블을 만들고 싶습니다.
{ DeviceID: 123, Timestamp: "2016-11-11T17:21:07.5272333Z", X: 12, Y: 35 }
SQL에서는 Timestamp에 datetime 유형을 사용할 수 있지만 DynamoDB에는 없습니다.
답변:
날짜 또는 시간 소인 에는 문자열 데이터 유형을 사용해야합니다.
문자열 데이터 유형을 사용하여 날짜 또는 타임 스탬프를 나타낼 수 있습니다. 이를 수행하는 한 가지 방법은 다음 예제에 표시된대로 ISO 8601 문자열을 사용하는 것입니다.
2016-02-15
2015-12-21T17 : 42 : 34Z
20150311T122706Z
날짜 또는 타임 스탬프에 대한 DynamoDB 데이터 유형
예, 날짜가 문자열로 저장 될 때 범위 쿼리가 지원됩니다. 는 BETWEEN 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."}}}}}
데이터 유형은 요구 사항에 따라 다릅니다.
ISO 형식을 사용하는 문자열 또는 epoch 형식을 사용하는 숫자를 사용할 수 있습니다.
ISO 형식 (문자열)의 장점은 사람이 쉽게 읽을 수 있다는 점이지만 DynamoDB는이 형식에 대해 TTL (Time To Live)을 지원하지 않습니다. 모든 필터는 notionquest에서 설명한대로 '사이'및 '범위'와 같이 작동합니다.
DynamoDB 용 TTL (Time To Live) 을 사용하면 테이블의 항목이 만료되는시기를 정의하여 데이터베이스에서 자동으로 삭제할 수 있습니다.
Epoch 형식 (숫자) 사용의 장점은 TTL 기능과 모든 필터를 사용할 수 있다는 것입니다.
TLDR;
Epoch 형식 (숫자 유형)-TTL (Time To Live)
ISO 형식 (문자열 유형)을 사용할 수 있습니다.-TTL (Time To Live)은 사용할 수 없지만 사람이 더 읽기 쉽습니다.
숫자 데이터 유형 또는 문자열 데이터 유형
날짜 또는 타임 스탬프에 사용할 수 있습니다 .이 질문에 대한 수락 된 답변이 숫자를 무시하고 잘못 골라 내기 때문에 문자열 뿐만 아니라
숫자 데이터 유형을 사용하여 날짜 또는 타임 스탬프를 나타낼 수 있습니다. 이를 수행하는 한 가지 방법은 1970 년 1 월 1 일 00:00:00 UTC 이후의 초 수인 에포크 시간을 사용하는 것입니다. 예를 들어, 에포크 시간 1437136300은 2015 년 7 월 17 일 UTC 오후 12:31:40을 나타냅니다.
자세한 내용은 http://en.wikipedia.org/wiki/Unix_time을 참조하십시오 .
...
문자열 데이터 유형을 사용하여 날짜 또는 타임 스탬프를 나타낼 수 있습니다. 이를 수행하는 한 가지 방법은 다음 예제에 표시된대로 ISO 8601 문자열을 사용하는 것입니다.
2016-02-15
2015-12-21T17 : 42 : 34Z
20150311T122706Z
자세한 내용은 http://en.wikipedia.org/wiki/ISO_8601을 참조하십시오 .
쿼리 요청을 보낼 때 결과를 필터링 할 수 있도록 DateTime에 epoch 형식을 사용했습니다. 문자열을 사용하는 것보다 효율적입니다.
이러한 시나리오를 상상해보십시오 : 지난 31 일, 지난 24 시간, ... 다시 시작 _with 연산자 ( AWS doc의 아래 링크에서 세 번째 예를 확인하십시오) 가 있기 때문에 문자열 형식을 사용하여 모두 가능 하지만 숫자 값은 측면에서 훨씬 더 효율적입니다. 정렬 (비교) 및 계산하는 동안 성능의.
날짜-시간을 epoch 형식으로 쉽게 변환 할 수 있습니다.
자바 스크립트 :
var date = new Date();
var epoch = date.getTime();
// converting back to date-time
var initial_date = new Date(epoch);
씨#
var date = DateTime.UtcNow;
var epoch = new DateTimeOffset(date).ToUnixTimeSeconds();
// converting back to date-time
var initial_date = DateTimeOffset.FromUnixTimeSeconds(epoch);
파이썬
import time
epoch = time.time()
# converting back to date-time
initial_date = time.gmtime(epoch )