這是我的稅率表「歷史」,其中start_date
和end_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:00value
爲任何現在或將來的日期
這start_date
和end_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
我敢肯定這是一個常見的問題,但我不能得到它。
您的第一個查詢無法選擇(說)1965-01-01的NULL值。 – gremo
@gremo。 。 。它如何失敗?第一個子句'(NOW()> = start_date或start_date爲空)'由於'start_date'爲空,第二個子句'(NOW()<= end_date或end_date爲null) 「評估爲真,因爲日期在」1972-12-31 23:59:59「之前。 –
對不起,我感覺很蠢,我的不好。它按預期工作。 – gremo