Loại dữ liệu nào nên được sử dụng cho dấu thời gian trong DynamoDB?


98

Tôi mới sử dụng DynamoDB. Tôi muốn tạo một bảng sử dụng DeviceID làm khóa băm, Dấu thời gian làm khóa phạm vi của tôi và một số dữ liệu.

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

Trong SQL, chúng ta có thể sử dụng kiểu datetime cho Timestamp, nhưng trong DynamoDB thì không có.

  1. Tôi nên sử dụng kiểu dữ liệu nào? Chuỗi? Con số?
    nhập mô tả hình ảnh ở đây

  2. Đối với loại dữ liệu đã chọn, tôi nên viết loại định dạng dấu thời gian nào? Định dạng ISO (ví dụ: 2016-11-11T17: 21: 07.5272333Z) hoặc thời gian kỷ nguyên (ví dụ: 1478943038816)?

  3. Tôi cần tìm kiếm thông qua bảng trong một khoảng thời gian, ví dụ: 1/1/2015 10:00:00 sáng đến 31/12/2016 11:00:00 chiều



2
Chúng tôi sử dụng một số ở định dạng / thời gian kỷ nguyên. Chúng tôi sử dụng nó cho các tìm kiếm phạm vi cũng cùng với cơ bản là một customer_id
George M Whitaker

Kiểu dữ liệu Chuỗi và Số có thể được sử dụng. Chuỗi khi lưu định dạng ISO8601 và Số khi lưu trữ thời gian Epoch. Xem thêm thông tin ở đây: abhayachauhan.com/2017/12/...
Abhaya Chauhan

Tài liệu chính thức nói, "Bạn có thể sử dụng kiểu dữ liệu chuỗi để biểu thị ngày tháng hoặc dấu thời gian. Một cách để làm điều này là sử dụng chuỗi ISO 8601".
Hồng

Câu trả lời mà bạn đã sao chép ảnh chụp màn hình của mình từ ( stackoverflow.com/a/27894543/1357094 ), trả lời Câu hỏi này - và Câu hỏi này thực sự trùng lặp với Câu hỏi của Câu trả lời ngay từ đầu: stackoverflow.com/questions/27894393/…
cellepo

Câu trả lời:


83

Kiểu dữ liệu Chuỗi nên được sử dụng cho Ngày tháng hoặc Dấu thời gian.

Bạn có thể sử dụng kiểu dữ liệu Chuỗi để biểu thị ngày hoặc dấu thời gian. Một cách để làm điều này là sử dụng chuỗi ISO 8601, như được hiển thị trong các ví dụ sau:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

DynamoDB Loại dữ liệu cho Ngày hoặc Dấu thời gian

Có, các truy vấn Phạm vi được hỗ trợ khi ngày được lưu trữ dưới dạng Chuỗi. Các GIỮA có thể được sử dụng trên FilterExpresssion. Tôi đã có các mục trong kết quả bằng cách sử dụng các biểu thức lọc bên dưới.

FilterExpression không tính thời gian: -

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

FilterExpression theo thời gian: -

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

Giá trị cơ sở dữ liệu: -

Định dạng 1 - với múi giờ:

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

Định dạng 2 - không có múi giờ: -

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

Nhưng bạn có thể thực hiện tìm kiếm theo phạm vi ngày khi chúng được lưu trữ dưới dạng giá trị Chuỗi không?
Mark B

@notionquest ya, bạn có thể thực hiện tìm kiếm theo phạm vi ngày và giờ với Chuỗi không?
Dennis

54
Tôi không hiểu cách bạn đến "Kiểu dữ liệu chuỗi nên được sử dụng cho Ngày tháng hoặc Dấu thời gian". Tài liệu cũng cho biết bạn cũng có thể sử dụng kiểu dữ liệu Số cho các ngày thông qua thời gian kỷ nguyên. Tại sao bạn nghĩ Chuỗi nên được sử dụng thay vì Số?
Roly

1
Kiểu dữ liệu Chuỗi và Số có thể được sử dụng. Chuỗi khi lưu định dạng ISO8601 và Số khi lưu trữ thời gian Epoch. Thông tin thêm tại đây: abhayachauhan.com/2017/12/…
Abhaya Chauhan

1
Các số @roly cũng hoạt động tốt nhưng chúng khó đọc hơn.
Matthew Bonig 10/09/18

22

Loại dữ liệu phụ thuộc vào yêu cầu của bạn.

Bạn có thể sử dụng Chuỗi sử dụng định dạng ISO hoặc Số sử dụng định dạng kỷ nguyên.

Ưu điểm của định dạng ISO (Chuỗi) là con người có thể đọc được tuy nhiên DynamoDB không hỗ trợ Time To Live (TTL) cho định dạng này. Tất cả các bộ lọc hoạt động, chẳng hạn như 'giữa' và 'phạm vi' như được giải thích bởi notionquest.

Thời gian tồn tại (TTL) cho DynamoDB cho phép bạn xác định khi nào các mục trong bảng hết hạn để có thể tự động xóa chúng khỏi cơ sở dữ liệu.

Ưu điểm của việc sử dụng định dạng epoch (Số) là bạn có thể sử dụng tính năng TTL và tất cả các bộ lọc.

TLDR;

Định dạng Epoch (Kiểu số) - Có thể sử dụng
Định dạng ISO của Time To Live (Kiểu chuỗi) - Không thể sử dụng Time To Live nhưng con người dễ đọc hơn


Biểu thức bộ lọc có thể được hỗ trợ bằng số, nhưng Điều kiện chính dựa trên phạm vi sẽ chỉ được hỗ trợ với các chuỗi ở định dạng ISO
Rafael Almeida

@RafaelAlmeida, ý bạn là gì? Và nguồn của bạn là gì?
Zachary Ryan Smith

1
@ZacharyRyanSmith Tôi đã nhầm - thực sự, thuộc tính Số hoạt động như các khóa sắp xếp và trong Điều kiện chính trong bộ lọc.
Rafael Almeida

2

Kiểu dữ liệu Số HOẶC kiểu dữ liệu Chuỗi

có thể được sử dụng cho Ngày hoặc Dấu thời gian - không chỉ Chuỗi vì Câu trả lời được chấp nhận cho Câu hỏi này đơn lẻ không chính xác trong khi bỏ qua Số.

Bạn có thể sử dụng kiểu dữ liệu số để biểu thị ngày hoặc dấu thời gian. Một cách để thực hiện việc này là sử dụng kỷ nguyên — số giây kể từ 00:00:00 UTC vào ngày 1 tháng 1 năm 1970. Ví dụ: thời gian kỷ nguyên 1437136300 đại diện cho 12:31:40 CH UTC vào ngày 17 tháng 7 năm 2015.

Để biết thêm thông tin, hãy xem http://en.wikipedia.org/wiki/Unix_time .

...

Bạn có thể sử dụng kiểu dữ liệu Chuỗi để biểu thị ngày hoặc dấu thời gian. Một cách để làm điều này là sử dụng chuỗi ISO 8601, như được hiển thị trong các ví dụ sau:

2016-02-15

2015-12-21T17: 42: 34Z

20150311T122706Z

Để biết thêm thông tin, hãy xem http://en.wikipedia.org/wiki/ISO_8601 .

DynamoDB Loại dữ liệu cho Ngày hoặc Dấu thời gian


1

để tôi có thể lọc ra kết quả khi gửi yêu cầu truy vấn, tôi đã sử dụng định dạng epoch cho DateTime, nó hiệu quả hơn so với sử dụng chuỗi.

hãy tưởng tượng những tình huống sau: 31 ngày qua, 24 giờ qua, ... một lần nữa, tất cả đều có thể sử dụng định dạng chuỗi vì nó cũng có toán tử begin_with ( vui lòng kiểm tra ví dụ thứ 3 trong liên kết bên dưới trên AWS doc ) nhưng giá trị số hiệu quả hơn nhiều về mặt hiệu suất trong khi sắp xếp (so sánh) và tính toán.

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

dễ dàng chuyển đổi ngày-giờ sang định dạng kỷ nguyên

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 )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.