【发布时间】:2018-11-03 13:32:39
【问题描述】:
我有一个客户报告财政年度中的 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 的示例结果集将如下所示:
【问题讨论】:
-
我猜没有人能帮上忙。您需要提供样本数据、期望的结果以及您正在做什么的解释。第一个循环之后的“崩溃”并不是一个非常准确的描述。
-
我应该补充一点,这个脚本是给我一个只有开始日期结束日期和期间编号的临时表。
-
这种问题真的让我本能地说——日期统计表。
-
没有人报告每年 13 个 27 天的周期。因为那是 351 天,一年有 365 天或 366 天。他们可能有自己使用的算法,如果有的话向他们索取。或者,为了简化生活,在您的数据库中创建一个日历表。然后在每个日期手动或半手动更新一些元数据(会计年度id、财政季度id、财政月份id等)。使用从 (例如) 2000-01-01 到 2099-12-31 的日期填充它,只要它涵盖您的应用程序将需要的每个日期。然后你可以从那个表中索引地狱。它将节省很多的复杂性。
-
嗨,戈迪,感谢您与我们联系。我就我需要的帮助而言,你在这里看到的就是你得到的。我只是尝试使用 while 循环将一些计算日期插入临时表。抱歉,如果帖子标题有点偏离,我的问题在我打字时有点变形。
标签: sql date while-loop temp-tables