對不起,關於標題 - 我無法想出一個更好的。我有一個發票系統,我需要計算在給定的日期間隔內哪些客戶協議(合同)將開具發票。合約運行的時間段由start_date
和end_date
日期列定義,其中持續時間始終以月爲單位(即自然月數)。每個invoice_interval
月份都會對客戶開具發票,這是每個合同定義的。如果此列包含數字3,則客戶每三個月發票一次。我需要的是瞭解哪些合同/協議將在兩個日期之間開具發票。日期將是一個月的21日和下個月的20日,都包括 - 例如,在2014-05-21
和2014-06-20
之間。查詢在給定日期間隔內要開具發票的客戶
基於該start_date
和end_date
,這可以通過添加invoice_interval
個月到start_date
的給定次數,例如可以計算與DATE_ADD()
。如果這些日期中的任何一個在X和Y之間,則存在匹配。問題是我不知道如何用SQL查詢來做這件事,並且沒有循環。我做了類似的事情,當我需要知道,如果一個合同將在特定月份開具發票(2014年6月在這個例子中):
SELECT *
FROM contracts
WHERE start_date <= '2014-06-01'
AND end_date >= '2014-06-30'
AND (PERIOD_DIFF('2014-06-01', DATE_FORMAT(start_date, '%Y%m')) % invoice_interval) = 0
這裏的邏輯是start_date
和月份之間檢查有無差異月我檢查除以invoice_interval
沒有休息 - 通過使用模數。如果是這樣,那麼合同應該在當月開具發票。例如,
因此,我需要更改上述查詢以確定合同是否應在2014-05-21
和2014-06-20
之間開具發票。假設合同開始於2014-01-14
,並在2015-01-14
結束,並且每3個月開具發票。我想查找將在2014-03-21
和2014-04-20
之間開具發票的合同。此給定合同應在結果集中,因爲它將在2014-04-14
,2014-07-14
和2014-10-14
上開具發票。我怎樣才能做到這一點?在上面的SQL查詢中更爲可取。
我希望我解釋得很好。先謝謝你!
太棒了,謝謝!我已經做了一些調整,以便合約在最後一個月內不會再有一段時間發票。到目前爲止,一切都看起來不錯,但我會繼續測試它。非常感謝您的回答! – Andy0708 2014-09-08 07:49:14