2013-05-08 40 views
2

我只能選擇訪問數據庫,並且不能創建存儲過程。如何在where子句一次過濾一個數據時如何自動查詢日期範圍?一次爲日期範圍一次運行多次查詢......不能使用sproc

例如....我需要針對2013年4月1日和2013年4月30日之間的每個日期一次運行類似於下面的查詢。看起來我應該可以用光標或其他東西來做到這一點。

declare @AsOfDate datetime 
SET @AsOfDate = '4/1/2013' 

select *,@AsOfDate AS 'AsOfDate' from table p 
where 
p.ENTER_WQ_DT <= @AsOfDate and 
((coalesce(p.FILE_DATE,p.DELETE_DATE) > @AsOfDate) or (p.FILE_DATE is null and p.DELETE_DATE is null and WQ_CTE.TAR_ID is not null)) 

我很想能夠運行這一點,並生成一個包含所有記錄,就像如果我手動編輯AsOfDate變量並運行它的月的每一天的結果。

回答

2
declare @AsOfDateStart datetime, @AsOfDateEnd datetime; 
select @AsOfDateStart = '20130401', @AsOfDateEnd = '20130430'; 

-- this "WITH" block starts a recursive Common Table Expression (CTE) 
-- that makes up a "table" of the dates, one per row 
with Dates as (
    select @AsOfDateStart AsOfDate 
    union all 
    select dateadd(d,1,AsOfDate) 
    from Dates 
    where AsOfDate < @AsOfDateEnd 
) 
select p.*, d.AsOfDate 
from Dates d 
join tablep p 
    on p.ENTER_WQ_DT <= d.AsOfDate and 
((coalesce(p.FILE_DATE,p.DELETE_DATE) > d.AsOfDate) or (p.FILE_DATE is null and p.DELETE_DATE is null and WQ_CTE.TAR_ID is not null)); 

關於這個查詢:

  1. 聯接有效地使要搜索的每一行tablep(一日期)在日期(虛擬)表中。

注意有關查詢:

  1. 不要使用模棱兩可的日期文字( '2013年4月1日')。格式YYYYMMDD是最佳
  2. 用方括號包圍,而不是單/雙引號(「AsOfDate」)[名]
+0

謝謝!這是完美的,非常靈活。日期CTE可以很容易地增加一個月,以在每個月的第一天獲得好的趨勢。 – user2364296 2013-05-09 15:48:36

+0

同樣欣賞最後關於格式化的筆記。 – user2364296 2013-05-09 15:50:04

1

SQL服務器提供looping mechanisms.

類似:

declare @AsOfDate datetime = '2013-04-01' 
declare @EndDate datetime = '2013-05-01'  

WHILE (@AsOfDate < @EndDate) BEGIN 
    --your query here 
    SET @AsOfDate = DATEADD(day, 1, @AsOfDate) 
END 
+0

不太我需要什麼,因爲這將返回多個記錄,但仍然是一個方便的技術來適當時使用。感謝您的回答。 – user2364296 2013-05-09 15:51:19