2012-06-04 83 views
12

Tôi giả định đó là một chuỗi, vì vậy tôi đã so sánh nó như một chuỗi, nhưng không ngạc nhiên là nó không thành công. Tôi tin rằng đó là cách nó hoạt động trong Mysql. Tôi có thể sai vì tôi đã không làm việc đó trong một thời gian. Trong cả hai trường hợp, làm cách nào để kiểm tra xem ngày tháng có bằng nhau trong SQLite không? Tôi sẽ sử dụng nó trong mệnh đề WHERE.Cách so sánh hai ngày trong SQLite?

SELECT a._id, b._id, b.start_date,a.event_name, b.start_time, 
b.end_date, b.end_time, b.location FROM events_info b INNER JOIN events a ON 
a._id=b.event_id WHERE b.start_time = '6:00'; 

(thêm không gian để làm cho nó dễ dàng hơn để nhìn vào)

+1

bạn nên đã gửi của bạn "không-làm việc" mã –

+0

Tôi không nhìn thấy điểm như tôi chắc chắn 100% dương tính so sánh thời gian/ngày là vấn đề. Nhưng nếu nó quan trọng đến mức tôi sẽ sẵn lòng bắt buộc. Xin lỗi vì điều đó. – Andy

+0

Bằng cách "so sánh hai ngày", bạn có nghĩa là "so sánh hai lần trong ngày", phải không? –

Trả lời

28

SQLite không có loại DATETIME chuyên dụng. Thông thường những gì mọi người làm là đảm bảo rằng họ lưu trữ ngày dưới dạng chuỗi được định dạng nhất quán; ví dụ: YYYY-MM-DD hh: mm: ss. Nếu bạn làm như vậy, miễn là bạn phù hợp, sau đó bạn có thể so sánh trực tiếp ngày:

SELECT * FROM a WHERE q_date < '2013-01-01 00:00:00'; 

này hoạt động bởi vì mặc dù sự so sánh về mặt kỹ thuật là một sự so sánh chữ cái và không phải là một số, số ngày trong một định dạng phù hợp giống như sắp xếp theo thứ tự bảng chữ cái cũng như số lượng.

Đối với lược đồ như vậy, tôi khuyên bạn nên lưu trữ ngày ở định dạng 24 giờ (ví dụ trên là nửa đêm). Pad tháng, ngày và giờ với số không. Nếu ngày của bạn sẽ kéo dài nhiều múi giờ, lưu trữ tất cả trong UTC và thực hiện bất kỳ chuyển đổi nào bạn cần phía máy khách để chuyển đổi chúng thành múi giờ địa phương.

Thông thường ngày và giờ được lưu trữ tất cả trong một cột. Nếu bạn phải tách chúng ra vì bất kỳ lý do nào, chỉ cần đảm bảo rằng ngày tháng của bạn đều nhất quán và thời gian của bạn đều nhất quán. Ví dụ: tất cả ngày phải là YYYY-MM-DD và tất cả thời gian phải là hh: mm: ss.

Lý do YYYY-MM-DD hh: mm: ss là định dạng ưa thích là vì khi bạn đi từ khoảng ngày lớn nhất (năm) đến nhỏ nhất (giây), bạn có thể lập chỉ mục và sắp xếp chúng rất dễ dàng và với hiệu suất cao.

SELECT * FROM a WHERE q_date = '2012-06-04 05:06:00'; 

sẽ sử dụng chỉ mục để trau dồi vào ngày/giờ thay vì phải quét toàn bộ bảng. Hoặc nếu chúng ở hai hàng riêng biệt:

SELECT * FROM a WHERE q_date = '2012-06-04' AND q_time = '05:06:00'; 

Điều quan trọng là đảm bảo ngày và giờ ở định dạng nhất quán đi vào cơ sở dữ liệu. Để trình bày thân thiện với người dùng, hãy thực hiện tất cả phía máy khách chuyển đổi, không phải trong cơ sở dữ liệu. (Ví dụ: chuyển đổi '2012-06-04 05:06:00' thành "1:06 sáng Đông 6/4/2012".)

Nếu điều này không trả lời câu hỏi, bạn có thể vui lòng đăng định dạng chính xác không mà bạn đang sử dụng để lưu trữ ngày và giờ của mình và hai ngày ví dụ mà bạn đang cố gắng so sánh không hoạt động theo cách bạn mong đợi?

+0

Điều này đúng. Nhưng whats điểm của việc có các loại đặt sang một bên trong cơ sở dữ liệu lol. Nó chỉ làm tôi bối rối khi cho phép mọi người tạo cột Ngày và Giờ, nhưng khi so sánh chúng, nó không thành công. Nhưng tôi chỉ có thể tạo cột Văn bản. Cảm ơn bạn. – Andy

+0

Thành thật mà nói, câu trả lời là cho tính di động. Bằng cách đó, nếu bạn đang chuyển từ SQLite sang [một số hệ thống DB khác] hoặc ngược lại, bạn không phải viết lại tất cả các truy vấn của mình. Hoặc ít nhất, nó dễ dàng hơn nhiều. –

+1

Cảm ơn. bạn lưu ngày của tôi :) Mã làm việc của tôi: - CHỌN * TỪ NGAY ĐĂNG KÝ WHERE time_Detail> '2014-06-18 23:13:00'; – pkc456

2

Từ Datatypes In SQLite Version 3:

1,2 Date and Time Datatype

SQLite không có một bộ lớp lưu trữ sang một bên để lưu trữ ngày và/hoặc thời gian. Thay vào đó, được xây dựng trong Date And Time Functions của SQLite có khả năng lưu trữ ngày tháng và thời gian như TEXT, REAL, hoặc giá trị INTEGER:

  • TEXT chuỗi như ISO8601 ("YYYY-MM-DD HH: MM: SS. SSS ").
  • REAL làm số ngày Julian, số ngày kể từ buổi trưa ở Greenwich vào ngày 24 tháng 11 năm 4714 trước Chúa. theo lịch Gregorian.
  • INTEGER là Thời gian Unix, số giây kể từ 1970-01-01 00:00:00 UTC.

Ứng dụng có thể chọn lưu trữ ngày và giờ theo bất kỳ định dạng nào và tự do chuyển đổi giữa các định dạng bằng cách sử dụng chức năng ngày và giờ tích hợp.

Nếu bạn nhìn vào các ví dụ trong Date And Time Functions, một cái gì đó như thế này sẽ giúp bạn gần với những gì bạn muốn (trong đó, tôi giả sử, là 06:00 của ngày hiện tại):

WHERE b.start_time = date('now', 'start of day', '+6 hours') 
3

Sqlite không thể so sánh ngày trực tiếp. chúng ta cần phải chuyển đổi chúng trong vài giây cũng như số nguyên.

Ví dụ

SELECT * FROM Table 
WHERE 
CAST(strftime('%s', date_field) AS integer) <=CAST(strftime('%s', '2015-01-01') AS integer) ;