DynamoDB의 타임 스탬프에는 어떤 데이터 유형을 사용해야합니까?


98

저는 DynamoDB를 처음 사용합니다. DeviceID를 해시 키로, Timestamp를 범위 키로 사용하고 일부 데이터를 사용하는 테이블을 만들고 싶습니다.

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

SQL에서는 Timestamp에 datetime 유형을 사용할 수 있지만 DynamoDB에는 없습니다.

  1. 어떤 데이터 유형을 사용해야합니까? 끈? 번호?
    여기에 이미지 설명 입력

  2. 선택한 데이터 유형에 대해 어떤 종류의 타임 스탬프 형식을 작성해야합니까? ISO 형식 (예 : 2016-11-11T17 : 21 : 07.5272333Z) 또는 epoch 시간 (예 : 1478943038816)?

  3. 시간 범위를 통해 테이블을 검색해야합니다. 예 : 1/1/2015 10:00:00 am ~ 31/12/2016 11:00:00 pm



2
기점 시간 / 형식으로 숫자를 사용합니다. 우리는 기본적으로 CUSTOMER_ID와 함께뿐만 아니라 범위 검색에 사용
조지 M 휘태커

문자열 및 숫자 데이터 유형을 사용할 수 있습니다. ISO8601 형식 저장시 문자열, Epoch 시간 저장시 숫자. 여기에 더 많은 정보 : abhayachauhan.com/2017/12/...
Abhaya 차우

offical 한 의사는 "당신은 날짜 또는 ISO 8601 문자열을 사용하여 타임 스탬프. 하나는이 작업을 수행하는 방법을 나타내는 문자열 데이터 유형을 사용할 수 있습니다"라고 말한다.
Hong

스크린 샷을 복사 한 답변 ( stackoverflow.com/a/27894543/1357094 ),이 질문에 대한 답변-이 질문은 실제로 처음에 답변의 질문을 언급 한 것과 중복됩니다 : stackoverflow.com/questions/27894393/…
cellepo

답변:


83

날짜 또는 시간 소인 에는 문자열 데이터 유형을 사용해야합니다.

문자열 데이터 유형을 사용하여 날짜 또는 타임 스탬프를 나타낼 수 있습니다. 이를 수행하는 한 가지 방법은 다음 예제에 표시된대로 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."}}}}}

그러나 문자열 값으로 저장 될 때 날짜 범위 검색을 수행 할 수 있습니까?
Mark B

@notionquest ya, String으로 날짜 및 시간 범위 검색을 할 수 있습니까?
Dennis

54
" 날짜 또는 타임 스탬프에 문자열 데이터 유형을 사용해야 합니다 "에 어떻게 도달했는지 알 수 없습니다 . 문서는 또한 epoch 시간을 통해 날짜에 숫자 데이터 유형을 사용할 수도 있다고 말합니다. 숫자 대신 문자열을 사용해야하는 이유는 무엇 입니까?
Roly

1
문자열 및 숫자 데이터 유형을 사용할 수 있습니다. ISO8601 형식 저장시 문자열, Epoch 시간 저장시 숫자. 여기에 더 많은 정보 : abhayachauhan.com/2017/12/...
Abhaya 차우

1
@roly 숫자도 잘 작동하지만 가독성이 떨어집니다.
Matthew Bonig

22

데이터 유형은 요구 사항에 따라 다릅니다.

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)은 사용할 수 없지만 사람이 더 읽기 쉽습니다.


필터 표현식은 숫자로 지원 될 수 있지만 범위 기반 키 조건은 ISO 형식의 문자열에서만 지원됩니다
Rafael Almeida

@RafaelAlmeida, 무슨 뜻이야? 그리고 당신의 출처는 무엇입니까?
Zachary Ryan Smith

1
@ZacharyRyanSmith 내가 틀렸다-실제로 Number 속성은 필터의 키 조건과 정렬 키로 작동합니다.
Rafael Almeida

2

숫자 데이터 유형 또는 문자열 데이터 유형

날짜 또는 타임 스탬프에 사용할 수 있습니다 .이 질문에 대한 수락 된 답변이 숫자를 무시하고 잘못 골라 내기 때문에 문자열 뿐만 아니라

숫자 데이터 유형을 사용하여 날짜 또는 타임 스탬프를 나타낼 수 있습니다. 이를 수행하는 한 가지 방법은 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을 참조하십시오 .

날짜 또는 타임 스탬프에 대한 DynamoDB 데이터 유형


1

쿼리 요청을 보낼 때 결과를 필터링 할 수 있도록 DateTime에 epoch 형식을 사용했습니다. 문자열을 사용하는 것보다 효율적입니다.

이러한 시나리오를 상상해보십시오 : 지난 31 일, 지난 24 시간, ... 다시 시작 _with 연산자 ( AWS doc의 아래 링크에서 세 번째 예를 확인하십시오) 가 있기 때문에 문자열 형식을 사용하여 모두 가능 하지만 숫자 값은 측면에서 훨씬 더 효율적입니다. 정렬 (비교) 및 계산하는 동안 성능의.

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

날짜-시간을 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 )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.