2014-01-11 71 views
1

這是我的稅率表「歷史」,其中start_dateend_date代表value適用的時間跨度(即在1972-12-31 23:59:59之前沒有稅,現在的稅從2013-10- 01 00:00:00):如何僅使用一個查詢執行當前稅率選擇?

+-------+---------------------+---------------------+ 
| value | start_date   | end_date   | 
+-------+---------------------+---------------------+ 
| NULL | NULL    | 1972-12-31 23:59:59 | 
| 12.00 | 1973-01-01 00:00:00 | 1977-02-07 23:59:59 | 
| 14.00 | 1973-02-08 00:00:00 | 1980-07-02 23:59:59 | 
| 15.00 | 1980-11-01 00:00:00 | 1982-08-04 23:59:59 | 
| 18.00 | 1982-08-05 00:00:00 | 1988-07-31 23:59:59 | 
| 19.00 | 1988-08-01 00:00:00 | 1997-09-30 23:59:59 | 
| 20.00 | 1997-10-01 00:00:00 | 2011-09-16 23:59:59 | 
| 21.00 | 2011-09-17 00:00:00 | 2013-09-30 23:59:59 | 
| 22.00 | 2013-10-01 00:00:00 | NULL    | 
+-------+---------------------+---------------------+ 

如何執行單個查詢,獲取正確的值?

  • NULL任何日期之前,1973年1月1日00:00:00
  • value爲任何現在或將來的日期

start_dateend_date

  • 22.00之間的任何日期打破了最後一個條件:

    SELECT * 
    FROM tax_rate 
    WHERE NOW() BETWEEN start_date AND end_date 
    

    這將打破第一個條件:

    SELECT * 
    FROM tax_rate 
    WHERE '1972-01-01' >= start_date 
        AND ('1972-01-01' <= end_date OR end_date IS NULL) 
    ORDER BY end_date IS NULL DESC, end_date DESC 
    LIMIT 1 
    

    我敢肯定這是一個常見的問題,但我不能得到它。

  • 回答

    0

    可以明確比較NULL

    SELECT * 
    FROM tax_rate 
    WHERE (NOW() >= start_date or start_date is null) AND 
         (NOW() <= end_date or end_date is null); 
    

    但是,因爲你的利率是不重疊的,也沒有空白,你可以得到一個基於start_date最後一個:

    select * 
    from tax_rate 
    where NOW() >= start_date or start_date is null 
    order by coalesce(start_date, '1900-01-01') desc 
    limit 1; 
    
    +0

    您的第一個查詢無法選擇(說)1965-01-01的NULL值。 – gremo

    +0

    @gremo。 。 。它如何失敗?第一個子句'(NOW()> = start_date或start_date爲空)'由於'start_date'爲空,第二個子句'(NOW()<= end_date或end_date爲null) 「評估爲真,因爲日期在」1972-12-31 23:59:59「之前。 –

    +0

    對不起,我感覺很蠢,我的不好。它按預期工作。 – gremo

    0

    您可以嘗試使用COALESCE是改變NULL

    SELECT * 
        FROM tax_rate 
    WHERE NOW() BETWEEN COALESCE(start_date, '1800-01-01') AND COALESCE(end_date, '2100-01-01') 
    
    相關問題