声明的类似数组的函数

时间:2019-07-11 17:05:38

标签: sql tsql sql-server-2008-r2

我有一条语句返回日期的单个数字。我想做的是能够跨日期范围执行该语句并获取每个日期的值。

const arr = [
  { date: "01.01.2017", dayOfWeek: "Tuesday" },
  { date: "01.01.2016", dayOfWeek: "Saturday" },
  { date: "01.01.2002", dayOfWeek: "Wednesday" },
  { date: "01.01.2003", dayOfWeek: "Wednesday" }
].sort(
  (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()
).forEach(m => {
  console.log(m.date, m.dayOfWeek);
});

这是我在当前语句中得到的单个日期的结果。 2019年6月1日

select dbo.GetItemMTDIssues(inmastx.fac, inmastx.fpartno, inmastx.frev, '6-01-2019') 
as MTDiss from inmastx where fpartno='ANF-10-6313-102'

这是我希望在诸如 2019年6月1日至2019年6月5日

|MTDiss|   
  600

如果有用,还包括该功能。

|MTDiss|   
  600   
  450   
  375   
  700   
  300

1 个答案:

答案 0 :(得分:2)

您首先需要创建范围,然后下面的t-sql将做到这一点。

declare @startDate datetime='6-01-2019'
declare @endDate datetime='6-05-2019'

;with DateRange as (
select @startDate [date]
union all
select DATEADD(day,1,[date]) [date] from DateRange where [date]<@endDate
)
select * from DateRange

我们可以对其进行测试,然后查看结果以确认这是我们想要的范围。 注意:如果您需要按月跳转或不按日跳数,则只需更改DATEADD中的代码即可。

现在,我们需要更新您的函数以获取范围的开始和结束,并使用所有范围日期,我认为类似下面的内容会有所帮助:-

CREATE FUNCTION [GetItemMTDIssuesRange]
(   
@fac char(20), @partno char(25), @rev char(3), @startDateRange datetime, @EndDateRange datetime
)
RETURNS TABLE 
AS
RETURN 
(
    with DateRange as (
    select @startDateRange [date]
    union all
    select DATEADD(day,1,[date]) [date] from DateRange where [date]<@EndDateRange
    )
    --select * from DateRange
    select (isnull(sum(fQty),0.0) * -1) MTDiss
                    from intran 
                    inner join DateRange on year(fdate) = year(DateRange.[date]) and month(fdate) = month(DateRange.[date]) 
                    where ftype = 'I'
                    and fac = @fac
                    and fpartno = @partno
                    and fcpartrev = @rev
                    group by DateRange.[date]
)
GO

请检查。

如果您不想更改此功能,以下内容也可能会有所帮助:-

declare @startDate datetime='6-01-2019'
declare @endDate datetime='6-05-2019'

;with DateRange as (
select @startDate [date]
union all
select DATEADD(day,1,[date]) [date] from DateRange where [date]<@endDate
)
select dbo.GetItemMTDIssues(inmastx.fac, inmastx.fpartno, inmastx.frev, DateRange.[date]) 
as MTDiss from inmastx,DateRange
 where fpartno='ANF-10-6313-102'