Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将财务期间计算到临时表中_Sql_Date_While Loop_Temp Tables - Fatal编程技术网

Sql 将财务期间计算到临时表中

Sql 将财务期间计算到临时表中,sql,date,while-loop,temp-tables,Sql,Date,While Loop,Temp Tables,我有一个客户,他在财政年度的13个27天期间进行报告,我正在尝试计算一些动态SQL,以确定发票在哪个报告期间提出 这是我到目前为止所做的,但是while循环在第一个循环之后崩溃了 IF OBJECT_ID('#Periods', 'U') IS NOT NULL drop table #Periods create table #Periods ([start_date] date, [end_date] date, Period varchar(3) ) declare @LYdt dat

我有一个客户,他在财政年度的13个27天期间进行报告,我正在尝试计算一些动态SQL,以确定发票在哪个报告期间提出

这是我到目前为止所做的,但是while循环在第一个循环之后崩溃了

IF OBJECT_ID('#Periods', 'U') IS NOT NULL
drop table #Periods

create table #Periods
([start_date] date, [end_date] date, Period varchar(3) )

declare @LYdt datetime,
        @CYdt datetime,
        @Period int

SET @Period = 0
SET @LYdt = '09/01/2016'
SET @CYdt = '09/01/2017'
While @Period  <=13

insert #Periods
select 
[Start_Date] = dateadd(mm,datediff(mm,'',@LYdt),'') - datepart(dw,dateadd(mm,datediff(mm,'',@LYdt),'')+0)+ 22,
[End Date] = (dateadd(mm,datediff(mm,'',@LYdt),'') - datepart(dw,dateadd(mm,datediff(mm,'',@LYdt),'')+0)+ 22)+27,
[Period] = 'P'+ convert(varchar(2),@Period)



SET @Period = @Period + 1
SET @LYdt =  dateadd(d,27,@LYdt)
SET @CYdt = dateadd(d,27,@CYdt)
有谁能帮我解决我的问题吗

戴夫

附加: sql的示例结果集如下所示:


如果您试图在两个日期之间生成句点,可以使用递归CTE:

with periods as (
      select cast('2016-09-01' as date) as start_date, 1 as lev
      union all
      select dateadd(day, 27, start_date), lev + 1
      from periods
      where start_date < '2017-09-01'
     )
select start_date,
       lead(start_date) over (order by start_date) as end_date,
       'P' + right('00' + cast(lev as varchar(255)), 2) as period_num
from periods;
编辑:

您可以通过执行以下操作轻松完成此操作:

with periods as (
      select cast('2016-09-01' as date) as start_date, 1 as lev
      union all
      select dateadd(day, 27, start_date), lev + 1
      from periods
      where start_date < '2017-09-01'
     )
select start_date,
       dateadd(day, 27, start_date) as end_date,
       'P' + right('00' + cast(lev as varchar(255)), 2) as period_num
from periods;

尽管同意你们的意见,他们需要为我提供工作的日期,但我不能让任务打败我,所以我最终写了一个有效的答案

它结合了一个用于连接日期的标量函数,我在这里找到了该函数,这要感谢Brian的函数:

用上面的Gordons代码

要获得最终产品,请执行以下操作:

declare @LY datetime,
        @TY datetime,
        @FD datetime,
        @TY_DATE datetime,
        @LY_DATE datetime,
        @FD_DATE datetime,
        @Use_date datetime

select @LY = dbo.datemaker(datepart(year,getdate())-2, 9, 1)
select @TY = dbo.datemaker(datepart(year,getdate())-1, 9, 1)
Select @FD = dbo.datemaker(datepart(year,getdate()), 9, 1)
 select @LY_DATE =  dateadd(mm,datediff(mm,'',@LY),'') - datepart(dw,dateadd(mm,datediff(mm,'',@LY),'')+0)+ 22
 select @TY_DATE = dateadd(mm,datediff(mm,'',@TY),'') - datepart(dw,dateadd(mm,datediff(mm,'',@TY),'')+0)+ 22
 select @FD_DATE = dateadd(mm,datediff(mm,'',@FD),'') - datepart(dw,dateadd(mm,datediff(mm,'',@FD),'')+0)+ 22

select @use_date = case when(convert(date,getdate()) >= @FD_DATE) then @TY_DATE ELSE @LY_DATE END;



with periods as (
      select @use_date as start_date, 1 as lev
      union all
      select dateadd(day, 28, start_date), lev + 1
      from periods
      where start_date < dateadd(year,1,start_date) and
      lev <=12)



select start_date as [Start_Date],
       dateadd(day, 27, start_date) as end_date,
       'P' + right('00' + cast(lev as varchar(255)), 2) +'LY' as period_num

from periods

union all

select dateadd(year,1,start_date) as [Start_Date],
       dateadd(year,1,dateadd(day, 27, start_date)) as end_date,
       'P' + right('00' + cast(lev as varchar(255)), 2) +'TY' as period_num



from periods;

CREATE FUNCTION [dbo].[Datemaker]
(
    @Year INT,
    @Month INT,
    @DayOfMonth INT

)
RETURNS DATETIME
AS
BEGIN

    RETURN 
            DATEADD(day, @DayOfMonth - 1, 
            DATEADD(month, @Month - 1, 
            DATEADD(Year, @Year-1900, 0)))

END

GO
感谢大家的贡献

问候,


戴夫

我猜没有人真的能帮上忙。您需要提供示例数据、期望的结果以及对您所做工作的解释。在第一个循环后崩溃并不是一个非常精确的描述。我应该补充一点,这个脚本是给我一个临时表,只包含开始日期和结束日期以及期间编号。这类问题让我本能地说-日期理货表。没有人报告每年13 x 27天的期间。因为那是351天,一年有365天或366天。他们可能有一个他们使用的算法,如果是的话,向他们索要。或者,为了简化生活,在数据库中创建一个日历表。然后手动或半手动更新会计年度id、会计季度id、会计月id等日期的一些元数据。使用日期填充它,例如2000-01-01到2099-12-31,只要它涵盖应用程序需要的每个日期。然后你就可以索引那张表了。这将节省大量的复杂性。嗨,高迪,谢谢你的联系。我需要我的帮助,你在这里看到的就是你得到的。我只是尝试使用while循环将一些计算过的日期插入临时表。抱歉,如果帖子标题有点不对劲,我的问题在我打字的时候有点变形。戈登,谢谢你,我应该提到,我现在在2008R2上,所以我担心lead不是一个选项。