2011-12-02 48 views
9

所以我有這樣的:SQL包括起始和終止日期

(CURDATE() BETWEEN start_date AND end_date) 

工作正常。

但是當CURDATE()是2011-12-02而end_date是2011-12-02它會抓住行嗎?

如我的起始日期是2011-12-01 00:00:00和我的結束日期是2011-12-02 23:59:59

因此,只有當日期間但如果它的工作原理在end_date本身。

或者也許它應該檢查的時間太多,因爲它仍然需要與此查詢選擇時,例如2011-12-02 15:30:00。

我該怎麼做?

+1

那麼明顯的答案是從'起始日期減去1天',並且爲'end_date'添加1天,但是我並沒有發佈這個答案,因爲可能有更好的SQL選擇。 – DaveRandom

+0

@dave,別人做的! –

+0

之間的手段不包括開始和結束,所以結果是正確的。所以它只在日期介於兩者之間時起作用,但不在介於end_date本身時。 –

回答

23

那麼,你可以嘗試

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

它將工作... BETWEEN作品包括邊界值的。也就是說,

(CURDATE() BETWEEN start_date AND end_date) 

,包括日期,結束日期及任何一天使用下降start_date <= CURDATE() AND end_date > CURDATE()

+1

但是,如果start_date的時間是在午夜之後。 。 。 –

2

由於兩個列時間戳,你需要確保時間不你絆倒。 爲了不讓時間絆倒你,把時間戳投給日期。

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

之間
CURDATE() BETWEEN start_date AND ADDDATE(CURDATE(), INTERVAL 1 DAY); 
3

也許回答這個問題指的是一個bug在舊版本的MySQL,因爲between是包容,這意味着它會搶在開始和結束日期之間的行包,而不是僅僅是開始之間結束前一天。

嘗試這種情況:

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

結果是1(即true)。 我相信最初的海報問題在於混合適當的日期(DATE)和日期與時間(DATETIMETIMESTAMP)。

嘗試這種情況:

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

結果是0爲第一選擇和1用於第二。發生了什麼是DATE相當於DATETIME零時間,所以除非NOW()恰好在午夜被調用,否則它將大於CURDATE()並且不在BETWEEN聲明之外。 爲了防止這種測試只是一個DATETIMEDATE部分使用DATE()功能:

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

投(END_DATE - 開始_爲雙精度)* 86400

相關問題