2011-12-02 69 views
9

Vì vậy, tôi có điều này:SQL giữa ngày kể cả bắt đầu và ngày kết thúc

(CURDATE() BETWEEN start_date AND end_date) 

trình tốt.

Nhưng khi CURDATE() là 2011-12-02 và end_date là 2011-12-02 nó sẽ lấy hàng?

Ví dụ start_date của tôi là 2011/12/01 00:00:00 và ngày kết thúc của tôi là 2011-12-02 23:59:59

Vì vậy, nó chỉ hoạt động khi ngày là giữa nhưng không nếu nó Trên chính bản thân số end_date.

Hoặc có thể cũng nên kiểm tra thời gian, vì nó vẫn cần phải được chọn với truy vấn này khi đó là 2011-12-02 15:30:00 chẳng hạn.

Tôi làm cách nào để thực hiện việc này?

+1

Vâng câu trả lời rõ ràng là để trừ đi 1 ngày từ 'start_date 'và thêm 1 ngày vào' end_date', nhưng tôi không đăng câu trả lời này vì câu trả lời có thể là một giải pháp thay thế SQL tốt hơn. – DaveRandom

+0

@dave, một người khác đã làm! –

+0

giữa các phương tiện không bao gồm bắt đầu và kết thúc để kết quả là chính xác. Vì vậy, nó chỉ hoạt động khi ngày là giữa nhưng không phải nếu nó là ngày chính nó. –

Trả lời

23

Vâng, bạn có thể thử

CURDATE() BETWEEN start_date AND DATE_ADD(end_date, INTERVAL 1 DAY) 
1

Nó sẽ làm việc ... BETWEEN công trình bao gồm các giá trị ranh giới. Đó là,

(CURDATE() BETWEEN start_date AND end_date) 

bao gồm start_date, end_date và bất cứ ngày nào rơi giữa

CURDATE() BETWEEN start_date AND ADDDATE(CURDATE(), INTERVAL 1 DAY); 
+1

Nhưng nếu start_date có thời gian sau nửa đêm. . . –

2

Sử dụng start_date <= CURDATE() AND end_date > CURDATE()

4

Kể từ khi cả hai cột được timestamps, bạn cần phải chắc chắn lần không vấp bạn lên . Để giữ cho thời gian từ vấp ngã bạn, hãy bỏ dấu thời gian cho đến nay.

where current_date between cast(start_date as date) 
         and cast(end_date as date); 
3

Có lẽ câu trả lời cho câu hỏi này dùng để chỉ một lỗi trong phiên bản cũ của MySql vì betweenđã bao gồm, có nghĩa là nó sẽ lấy hàng giữa ngày bắt đầu và kết thúc bao gồm, không chỉ giữa bắt đầu và một ngày trước khi kết thúc.

Hãy thử điều này:

SELECT CURDATE() BETWEEN CURDATE() AND CURDATE(); 

Kết quả là 1 (ví dụ: true). Tôi tin rằng vấn đề áp phích ban đầu nằm với việc trộn các ngày thích hợp (DATE) và ngày tháng với thời gian (DATETIME hoặc TIMESTAMP).

Hãy thử điều này:

SELECT NOW() BETWEEN CURDATE() AND CURDATE(); 
SELECT NOW() BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY); 

Kết quả là 0 cho chọn đầu tiên và 1 cho phần thứ hai. Điều gì đã xảy ra là DATE tương đương với DATETIME với thời gian bằng không, trừ khi NOW() được gọi chính xác vào lúc nửa đêm, nó sẽ lớn hơn CURDATE() và nằm ngoài tuyên bố BETWEEN. Để ngăn chặn kiểm tra này chỉ DATE một phần của một DATETIME sử dụng DATE() chức năng:

SELECT DATE(NOW()) BETWEEN CURDATE() AND CURDATE(); 
0

cast (end_date - start_date như độ chính xác kép) * 86400

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