2

我只有选择访问数据库的权限,不能创建存储过程。当 where 子句一次过滤一个数据时,有关如何自动查询日期范围的任何想法?

例如....我需要为 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 有效地导致在 tablep 中搜索 Dates(虚拟)表中的每一行(一个日期)。

关于您的查询的说明:

  1. 不要使用模棱两可的日期文字('4/1/2013')。格式 YYYYMMDD 最好
  2. 使用方括号括起 [names] 而不是单/双引号 ('AsOfDate')
于 2013-05-09T00:47:25.127 回答
1

SQL server 提供循环机制。

就像是:

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 回答