2010-04-09 133 views
1

我看到這個局面堆棧溢出,但沒有適合的MS-Access中的contect各種主題...SQL - 兩個日期(非VBA)之間的查詢範圍

給定一個起始日期和結束日期,有沒有一種方法可以通過SQL在時間範圍內爲每個給定的月份返回記錄?

EG:

A record has a Start Date of #1/1/2010# and an End Date of #1/31/2010# 

Running the query against that single record, I would like the results to be 
      #1/4/2010# (Monday the 4th) 
      #1/11/2010# (Monday the 11th) 
      #1/18/2010# ...etc 
      #1/25/2010# 

限制

  • MS-Access 2003中:任何情況下/在SQL中環路(IIF語句都不錯)
  • 這是一種觀點而已,沒有VBA會因爲數據不會被篡改。斷開連接的記錄集是我最後的選擇。我希望找到一些方法來調用SQL中的自定義函數以幫助返回這些值...某些類存儲在全局範圍內,而您在此日期範圍內迭代時可能...

這可能嗎?我看到很多不,但是如果有一種方法可以將值傳遞給函數,我可以找到一種方法來實現這個功能。可悲的是,我沒有辦法在不使用d/c記錄集的情況下模擬存儲過程,至少我知道......任何專家都知道某種方式?

+0

我很難理解這個問題。你的例子並沒有多說 – 2010-04-09 22:17:10

+0

我明白你的意思了。不幸的是,我沒有解決方案 – 2010-04-09 22:26:00

+0

它看起來像你已經關閉了不合適的所有方法,可以幫助你完成任務。我不知道如果你不打算以與你所說的不同的方式開展工作,任何人都無法幫助你。 – 2010-04-11 01:10:00

回答

1

你可以創建一個巨大的日曆表,日期和日期。 4/12/10,星期一; 4月13日星期二,星期二等,然後查詢結果的巨大表。你需要在過去和未來有多大的範圍?儘管這是一個笨拙的解決方案,但它肯定會使查詢變得乾淨和簡單。

+0

我曾經想過在給定點上,我不知道是否它的大小會失控,直到理論上的時間結束,這取決於使用這種方法的應用程序的生命週期......我仍然未決定走這條路,但它肯定是一個很好的方法與最小的VBA使用,雖然我會有一個方法啓動自動更新這張表隨着時間的推移... – Mohgeroth 2010-04-11 01:07:40

+0

什麼是項目的預期壽命?您可能會在未來十年更新它,所以請繼續創建3600行的表格,並且這是十年的好時光。或者比它大10倍,這比項目的壽命,操作系統,開發環境等都要多。 – Knox 2010-04-11 17:34:08

+1

我們已經知道Windows在25世紀仍然在使用中,因爲計算機上安全失敗的頻率很高星際迷航,所以它可能就是Access將被使用,然後... – 2010-04-12 19:37:31

0

您正在討論一條查詢,該查詢會從一條記錄中生成多個記錄(每個日期一個)。我想這應該通過存儲過程(如果您的數據庫是SQL)或通過記錄集。沒有查詢會做的伎倆。在需要的地方創建一個記錄集並添加記錄對我來說似乎很簡單。你應該去做。

1

由於這可能與報告有關,所以您可以使用臨時表方法,但這並不是很糟糕,尤其是如果您可能在給定時間段內運行多個報告(但請注意多個用戶)。

現在,只是爲了好玩,這裏是一個超級難看,但半柔性的方法(使用表10項,適用於各種273年)

建立一個叫做T10有一個字段的表 - ID (使其長和主鍵),然後輸入十行:0,1,2,3..9

SELECT #1/1/2010#+ 
     [t10].[ID]+ 
     [t100].[iD]*10+ 
     [t1000].[ID]*100+ 
     [t10000].[ID]*1000+ 
     [t100000].[iD]*10000 AS Mondays, 
FROM t10, 
    t10 AS t100, 
    t10 AS t1000, 
    t10 AS t10000, 
    t10 AS t100000 
WHERE Weekday(#1/1/2010#+ 
       [t10].[ID]+ 
       [t100].[iD]*10+ 
       [t1000].[ID]*100+ 
       [t10000].[ID]*1000+ 
       [t100000].[iD]*10000)=2; 

回報畢竟從星期一至2010-1-1 2283-10- 15並不像醜陋一樣慢。 當然要得到問題的解決方案,您必須篩選字段date1和date2的結果。

實質上,這與臨時表具有相同的解決方案,主要區別在於不必在每個查詢上重建表。

你可以用只有一個表條目爲0..99999來實現相同的結果,如果我要使用臨時表,我可能會使用類似的東西。

0

我希望我能正確理解你的問題。爲此,我們需要創建一個笛卡爾產品 - 所以你應該創建另一個表。它只需要一個ID,其中的數字從1到您的日期範圍將包含的最長週數。

For example table: tCounter(CounterID int) 
CounterID 
1 
2 
3 
4 
etc.. 

測試數據我創建了一個模擬表數據

For example: tDates(DateID int, startdate datetime, enddate datetime) 
DateID, Startdate, EndDate 
1, 1/1/10  1/31/10 
2, 1/18/10  3/4/10 
3, 2/1/10  2/28/10 

,將產生的結果MSACCESS SQL語句類似於

SELECT tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7) AS NewDay 
FROM tDates, tCounter 
WHERE (((((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7))<=[enddate])) 
ORDER BY tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7); 

如果你想改變的日子從星期一到另一天,改變星期幾功能的參數。 1=Sunday->7=Saturday

e.g. Weekday([startdate],3)...the 3=Tuesday so result is Monday 
e.g. Weekday([startdate],5)...the 5=Thursday so result is Wednesday 

希望對你有用。