多个where子句日期

时间:2017-10-15 19:14:03

标签: sql sql-server tsql

我将两个日期范围传递给我的程序,然后我选择每个月的最后日期,如下所示

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'。

股票报告结果应该是这样的。

STOCK REPORT EXAMPLE

请帮忙做些什么?

注意: - 它应该能够在需要时通过任何日期范围。

1 个答案:

答案 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)代替临时表。