我将两个日期范围传递给我的程序,然后我选择每个月的最后日期,如下所示
create procedure stcheck
@From_Date date,
@To_Date date
as
begin
declare @tmpTable table (dates date)
declare @startDate date = @From_Date
declare @endDate date = @To_Date
while @startDate <= @endDate
begin
insert into @tmpTable (dates) values (@startDate)
set @startDate = DATEADD(DAY, 1, @startDate)
end
select max(dates) as [Last day] from @tmpTable as o
group by datepart(YEAR, dates), datepart(MONTH, dates)
如果得到如下结果
Last day
2017-01-31
2017-02-28
2017-03-31
2017-04-30
我需要使用这些日期输出
将一些数据传递给临时表前: -
Insert #xyz
Select * from abcd where postdate <=’2017-01-31’
我的要求是这些所有日期都应自动使用,相关数据应传递给#table。
嗨专家。感谢您的早日回复。
简而言之,我的要求如下。请帮忙,因为我是sql的新手。
想一想,我有一张桌子作为'股票'进出股票交易和股票
报告可以按照以下方式进行,如日期SELECT item ,SUM(InQty-OutQty) FROM stock
WHERE TransDate <= @AsatDate
GROUP BY item
Having SUM(InQty-OutQty) > 0
如果我在通过日期范围时需要获得每个月的最终库存
从@From date ='2017/05/01'到@ AsatDate ='2017/09/30'。
股票报告结果应该是这样的。
请帮忙做些什么?
注意: - 它应该能够在需要时通过任何日期范围。
答案 0 :(得分:0)
您的问题有点不清楚,但我假设您要运行存储过程并将数据插入临时表#xyz
(假设临时表#xyz已存在):
insert into #xyz
exec stcheck @From_Date, @To_Date
现在有点切线:
如果您需要像这样的参数化,确定性表格输出,我也会查看table-valued functions。我同意@John你应该尽可能避免循环。实现这一目标的一种可能方法是使用预先填充的日历表(比如说在表中将50-100年的未来日历日期表示并在计算中使用它),而不是每天迭代,有大量的示例如何在网上这样做)。另一种方法是使用递归CTE或数字表,两者都在答案here中列出。
一旦您的日历日期很容易查询,您就可以将所有这些日期保留在视图或内联表值函数中,它将非常快速且更加清晰。如果您经常使用&#34;月份的最后一天&#34;作为过滤条件,您甚至可以将它们预先计算为日历表中的列。以下是最终结果:
insert into #xyz
select dbo.DatesBetween(@From_Date, @To_Date)
如果只使用一次,您甚至可以直接在查询中使用dbo.DatesBetween(@From_Date, @To_Date)
代替临时表。