2011-03-26 50 views
6

Tôi đang làm việc trong SQLite vì vậy tôi đang lưu trữ ngày chỉ là văn bản.Các ngày có thể được lưu trữ dưới dạng chuỗi/văn bản được so sánh trực tiếp?

YYYY-MM-DD hh:mm:ss

Theo như tôi có thể xác định, tôi sẽ có thể ra lệnh cho họ hay so sánh chúng với nhau cũng giống như họ không lo lắng về hàm ngày tháng kể từ khi bất kỳ incrementing bắt đầu ngay và di chuyển trái, giống như số và tất cả các giá trị đều là số và các ký tự không phải số được chuẩn hóa và tôi đang sử dụng thời gian 24 giờ.

Tôi tiếp tục thấy mọi người trực tuyến đề cập đến cách ngày chuyển đổi văn bản cho bất kỳ so sánh nào, nhưng tôi không thấy lý do tại sao họ sẽ không hoạt động - miễn là chúng lớn nhất -> nhỏ nhất gọi món. Rõ ràng tôi không thể làm toán, nhưng Select DateTime From Table where DateTime > 2010-04-21 15:34:55 phải hoàn toàn đáng tin cậy, phải không?

Có ngoại lệ nào mà tôi không nghĩ tới không?

Trả lời

3

Lý do bạn thấy nhiều chuyển đổi khi lưu trữ ngày trong cơ sở dữ liệu, hầu hết các công cụ cơ sở dữ liệu đều có loại dữ liệu 'gốc' cho ngày/giờ. SQLite thì không. Nó cho thấy bạn lưu trữ ngày tháng dưới dạng chuỗi hoặc như là các giá trị dấu phảy động ngày tháng julian.

Ngoài ra, một số cơ sở dữ liệu khác có các chức năng ngày-to-chuỗi che khuất (Tôi đang xem bạn, SQL Server), ở đó rất khó để tìm ra cách nhận chuỗi ngày có thể sắp xếp. Định dạng ngày mặc định của SQLite (YYYY-MM-DD HH: NN: SS) hoàn toàn có thể sắp xếp và dễ đọc.

Bạn sẽ làm tốt với các ngày văn bản khi so sánh hoặc đối chiếu - miễn là bạn sử dụng đúng định dạng, như bạn đang trình bày.

Thực tế, bạn thậm chí có thể làm toán, bằng cách sử dụng số date and time functions của SQLite; chúng khá phi chính thống nhưng linh hoạt đáng ngạc nhiên.

+0

ok tuyệt vời! Tôi không thể thấy được lý do tại sao nó sẽ không hoạt động như thế ... – Damon

5

Điều này chỉ hoạt động tốt. SQLite không có kiểu dữ liệu DATE (hoặc DATETIME) thực tế giống như nhiều cơ sở dữ liệu khác. Tùy chọn của bạn là lưu trữ ngày theo định dạng chuỗi sẽ sắp xếp đúng (YYYY-MM-DD hoặc YYYY-MM-DD hh: mm: ss) hoặc để chuyển đổi ngày thành số và lưu trữ thay vào đó.

Nếu bạn sử dụng định dạng chuỗi, sau đó bạn phải bao gồm dấu ngoặc kép của khóa học:

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55' 
+1

Siêu, mẹo lừa đặt chuỗi trong một trích dẫn đã lưu ngày của tôi. Đã tìm kiếm giải pháp .. cảm ơn – Saqib

1

Họ có thể được so sánh dưới dạng văn bản miễn là giá trị thực tế là những gì bạn mong đợi họ được. Đó chính là vấn đề.

So sánh ngày tháng dưới dạng văn bản giống như chạy bằng kéo. Nhưng SQLite làm cho bạn chạy với kéo tất cả các thời gian.

sqlite> create table test (d1 datetime primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

Một DBMS mà phù hợp với tiêu chuẩn SQL sẽ nâng cao một "ra khỏi phạm vi" báo lỗi khi bạn cố gắng để chèn hoặc các giá trị cập nhật như '2011-31-31 08:63:00'. Nhưng SQLite cho phép bạn chèn bất cứ thứ gì. Bạn thậm chí có thể chèn 'Catcall' vào một cột datetime. (Hãy thử.)

SQLite cung cấp cho bạn hành vi "chạy bằng kéo" giống nhau nếu bạn sử dụng văn bản.

sqlite> create table test (d1 varchar(25) primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

Nếu giá trị không như mong đợi, bạn có thể thấy loại hành vi sau.

sqlite> create table test (d1 varchar(25), d2 varchar(25)); 
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00'); 
sqlite> select d1<d2 from test; 
1 
sqlite> update test set d2 = '2011+01-01 08:15:00'; 
sqlite> select d1<d2 from test; 
0 
+0

Để công bằng, 'Catcall' không bao giờ được chèn vào cột 'datetime' trong SQLite; thay vào đó, cột sẽ là cột Văn bản. Và miễn là chúng tôi đang chạy bằng kéo, bạn có thể chèn nhiều văn bản như bạn muốn trong một cột varchar (25) như SQLite sẽ không tuân theo giới hạn 25 char được xác định. –

1

Nếu tất cả những gì bạn đang làm là đối chiếu và tìm kiếm, bạn sẽ ổn. Mọi người đã sử dụng định dạng này trong nhiều năm với tên tệp chính xác cho mục đích đó. Nó chỉ nên bắt đầu phá vỡ nếu bạn cần phải làm những việc liên quan đến tính toán (như tìm tất cả hồ sơ trong vòng ba mươi ngày kể từ ngày cụ thể).

Các vấn đề liên quan