2011-12-02 9 views
9

Więc mam to:SQL między datami włącznie z datami rozpoczęcia i zakończenia

(CURDATE() BETWEEN start_date AND end_date) 

działa dobrze.

Ale kiedy CURDATE() jest 2011-12-02, a end_date jest 2011-12-02 będzie pobrać rząd?

Np moja data_początkowa jest 2011-12-01 00:00:00 Data i mój koniec jest 2011-12-02 23:59:59

Tak to działa tylko wtedy, gdy data jest pomiędzy, ale jeśli nie jest to NA samym end_date.

A może powinien sprawdzić również czas, ponieważ nadal musi zostać wybrany przy pomocy tego zapytania, gdy jest 2011-12-02 15:30:00 na przykład.

Jak mogę to zrobić?

+1

Dobrze Oczywistą odpowiedzią jest, aby odjąć 1 dzień od 'datą_początkową ', i dodaj 1 dzień do' end_date', ale nie umieszczam tego jako odpowiedzi, ponieważ może istnieć lepsza alternatywa SQL. – DaveRandom

+0

@dave, ktoś inny zrobił! –

+0

między środkami wykluczającymi początek i koniec, aby wynik był poprawny. Tak więc działa tylko wtedy, gdy data jest między, ale nie, jeśli jest w samym dniu end_date. –

Odpowiedz

23

Cóż, można spróbować

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

Będzie ona działać ... BETWEEN robót włącznie z wartościami granicznymi. Oznacza to, że

(CURDATE() BETWEEN start_date AND end_date) 

tym data_poczÄ datą_końcową i dowolnym dniu przypadającym między

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

Ale jeśli data_początkowa ma czas po północy. . . –

2

Korzystając start_date <= CURDATE() AND end_date > CURDATE()

4

Ponieważ obie kolumny są znaczniki czasu, trzeba upewnić się, że czasy nie potknąć cię . Aby nie dopuścić do potknięcia się w czasie, należy przesyłać sygnatury czasowe do tej pory.

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

Być może odpowiedź na to pytanie odnosi się do błędu w starej wersji MySQL ponieważ betweenjest włącznie, co oznacza, że ​​będzie chwycić wiersze między datami rozpoczęcia i zakończenia włącznie, nie tylko między początkiem a jeden dzień przed końcem.

Spróbuj:

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

W rezultacie 1 (tj true). Wierzę, że oryginalny problem z plakatem polega na wymieszaniu właściwych dat (DATE) i dat z czasem (DATETIME lub TIMESTAMP).

Spróbuj tego:

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

Rezultatem jest 0 za pierwsze wybierz i 1 na sekundę. To, co się stało, jest równe DATE jest równoważne z DATETIME z czasem zerowym, więc jeśli NOW() jest wywoływane dokładnie o północy, będzie ono większe niż CURDATE() i wypadnie poza instrukcję BETWEEN. Aby zapobiec tego testu tylko DATE część DATETIME pomocą DATE() funkcję:

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

wylewane (end_date - data_rozpoczęcia jako podwójnej precyzji) * 86400

Powiązane problemy