2

データベースへの選択アクセス権しかなく、ストアド プロシージャを作成できません。where句が一度に1つのデータをフィルタリングするときに、日付範囲のクエリを自動化する方法についてのアイデアはありますか?

たとえば....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 変数を手動で編集して毎月実行した場合と同じように、すべてのレコードを含む結果を生成できるようにしたいと考えています。

4

2 に答える 2

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. JOIN により、Dates (仮想) テーブルの各行 (日付) に対して tablep が効果的に検索されます。

クエリに関するメモ:

  1. あいまいな日付リテラル ('4/1/2013') は使用しないでください。YYYYMMDD の形式が最適です
  2. [名前] を囲むには、一重/二重引用符 ('AsOfDate') の代わりに角括弧を使用します
于 2013-05-09T00:47:25.127 に答える
1

SQL サーバーは、ループ メカニズムを提供します。

何かのようなもの:

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
于 2013-05-08T23:47:21.097 に答える