我正在爲我們公司的筆記本電腦刷新編寫預訂系統。我需要能夠計算出哪幾天有可用插槽,並返回他們在一個日曆控件來呈現(即,如果每天有可用天數是可選的,否則不使用c#和SQL檢查日期範圍的最有效方法
的邏輯如下:
- 技術人員可以建立每天3檯筆記本電腦。
- 在任何一天都有可能是可用的1,2或3的技術人員。
- 的表將舉行的預訂已經取得
每天可用的時隙總數(以僞代碼):
((laptops per day) * (technicians available)) - slots already booked
我的問題是,什麼是獲得這種最有效的方法是什麼?我想最好在SQL端完成,並帶有一個函數來返回帶有可用插槽的日期表。 (只要至少有一個插槽可用,這並不重要。)
到目前爲止,我可以把所有這一切都歸功於我。我堅持的是,我不想有一個所有可能的日期表,因爲它似乎有點低效。我希望能夠做的是有效地迭代現在到未來3個月之間的一系列日期,並從那裏計算可用日期。
我可以在c#中做到這一點,但它會讓我覺得效率低下,因爲它將不得不在每個可能的日子裏繼續敲擊SQL服務器。似乎最好在SQL方面做,但我不知道如何以這種方式迭代可能的日期。
解決方案到目前爲止
使用@克里斯的方法,我可以得到一個日期範圍,其中插槽書沒有一組超過最大:
DECLARE @startDate DATE
DECLARE @endDate DATE
SET @startDate = GETDATE()
SET @endDate = DATEADD(m,3,@startDate)
;
WITH dates(Date) AS
(
SELECT @startdate as Date
UNION ALL
SELECT DATEADD(d,1,[Date])
FROM dates
WHERE DATE < @enddate
)
SELECT Date
FROM dates
EXCEPT
SELECT date
FROM tl_sb_booking
GROUP BY date
HAVING COUNT(date) < 3
這只是設置任意最大的3次預訂。下一步是添加技術人員可用性!
對於日期範圍,你在看'實際日期還是TimeSpan' – MethodMan
我猜的實際日期。假設我從7月1日到10月1日的範圍內,我想迭代每個日期(從7月1日開始),並檢查是否有可用的插槽。如果是這樣,請將它添加到表中以返回 - 如果沒有,則不要。我想要的最終結果基本上只是一個包含單個(日期)列的日期列表,其中仍有可用的插槽。 – Ben
你真的認爲效率會很重要嗎?也許你應該考慮更多更容易編寫和維護的代碼類型? –