1

我有一張表格,它定義了僅使用月和日的幾個非重疊日期。它基本上是庫存物品的「庫存」表格,允許您在季節性業務中存儲一年中的不同金額。以下是一個單個項目庫存表的外觀示例。請注意,我有一個項目表,我沒有在這裏顯示。在此表中,ItemID是一個外鍵,StockID是主鍵。檢查日期是否在期間內未確定年份

StockID ItemID BeginDate EndDate QtyTrigger ReorderQty 
     1   1   11/1  1/31    0    1 
     2   1   2/1  5/31    1    2 
     3   1   6/1  10/31    1    1 

所以我們說,我想2013年1月15日,獲得重排序查詢/報表的日期從我目前的邏輯我的查詢將返回不正確的,因爲它是這樣的:

SELECT i.*, st.QtyTrigger, st.ReorderQty 
FROM t20Itm AS i INNER JOIN t20Itm_Stock AS st ON i.ItemID = st.ItemID 
WHERE #01/14/2013# >= CDate(st.BeginDate & "/2013") AND 
#01/14/2013# <= CDate(st.EndDate & "/2013") 
AND i.QtyOnHand <= st.QtyTrigger 

問題是本例中11/1的BeginDate需要是2012年11月1日。在我的示例中,我展示了2013年,因爲這是我能夠用來生成此查詢的唯一邏輯。

這裏我懷疑我的問題可能是一個更大的設計缺陷,所以我在尋找如何做到這一點,否則一個更好的主意一個答案,也許有一些原因,這個設計是一個壞主意。

我知道我可以通過不允許日期跨度橫跨12月31日去做到這一點。但是,這個應用程序的很多用戶都有一個從11月到2月的時間段,這是他們最慢的幾個月。他們最終會創建兩個不同的日期範圍,其中包含相同的數據,一個用於11月/ 12月,另一個用於1月/ 2月。

我正在使用SQL Server作爲前端應用程序的數據庫和MS Access。我可以使用T-SQL或Access VBA,因此您的解決方案可以位於任一個中。

回答

1

我相信這個骯髒-where子句,黑客應該這樣做:

WHERE 
    ((CDate(st.BeginDate & "/2013") <= (CDate(st.EndDate & "/2013")) 
    AND (#01/14/2013# BETWEEN CDate(st.BeginDate & "/2013") AND CDate(st.EndDate & "/2013"))) 
    OR 
    ((CDate(st.BeginDate & "/2013") > (CDate(st.EndDate & "/2013")) 
    AND (#01/14/2013# BETWEEN CDate(st.BeginDate & "/2012") AND CDate(st.EndDate & "/2013"))) 

注重的是,這些兩個邏輯表達式在今年(2013與2012)不同。如果開始 - 結束按照時間順序,則使用第一個表達式(同一年)。如果不是,則使用第二個表達式(從去年開始,以當前結束)。

然而這可能會有非常差的表現。我建議你將日期存儲爲兩個單獨的列,並使用這個或類似的邏輯來查詢。只有這樣你才能利用索引。

+1

'我建議你把你的日期存儲爲兩個單獨的列'你能澄清一下嗎?你是否建議他們是日期欄?我想知道是否可以更好地將我的股票日期存儲爲DayOfYearNumber。然後,我所要做的就是獲取CurrentDayOfYearNumber,並找出它適合哪個範圍。這樣做肯定會更快,並且可以使用索引,不是嗎? – HK1

+0

我的想法是介紹月和日,這樣更容易維護系統。但是你的想法應該是更好的表現。然後,您可以應用類似的where子句。 – OzrenTkalcecKrznaric

相關問題