从sql中的日期开始倒数

问题描述 投票:-1回答:2

我正试图从新的学术季度开始算起。我正在跟踪学生何时报名,并想比较学期开始前的天数。该季度的第一天并不总是一样。我在中央数据库中有一个日期表,其中列出了每个日期,日期所在的季度以及第一天的标志。

因此,这是我要执行的操作的简化表。

+-----------+---------+----------------+---------------------+
| Date      | Quarter | First Day Flag | Days before quarter |
+-----------+---------+----------------+---------------------+
| 1/1/2020  | Q1      | Y              | 0                   |
+-----------+---------+----------------+---------------------+
| 1/2/2020  | Q1      | N              | -5                  |
+-----------+---------+----------------+---------------------+
| 1/3/2020  | Q1      | N              | -4                  |
+-----------+---------+----------------+---------------------+
| 1/4/2020  | Q1      | N              | -3                  |
+-----------+---------+----------------+---------------------+
| 1/5/2020  | Q1      | N              | -2                  |
+-----------+---------+----------------+---------------------+
| 1/6/2020  | Q1      | N              | -1                  |
+-----------+---------+----------------+---------------------+
| 1/7/2020  | Q2      | Y              | 0                   |
+-----------+---------+----------------+---------------------+
| 1/8/2020  | Q2      | N              | -5                  |
+-----------+---------+----------------+---------------------+
| 1/9/2020  | Q2      | N              | -4                  |
+-----------+---------+----------------+---------------------+
| 1/10/2020 | Q2      | N              | -3                  |
+-----------+---------+----------------+---------------------+
| 1/11/2020 | Q2      | N              | -2                  |
+-----------+---------+----------------+---------------------+
| 1/12/2020 | Q2      | N              | -1                  |
+-----------+---------+----------------+---------------------+
| 1/13/2020 | Q3      | Y              | 0                   |
+-----------+---------+----------------+---------------------+

我需要代码来生成从该季度的第一天开始倒数的第四列。

sql sql-server
2个回答
0
投票

尝试一下,

create table #temp(Dates Date,Quarters char(2)
,FirstDayFlag char(1), DaysBeforeQuarter int)

insert into #temp values
('1/1/2020','Q1','Y'  ,null  )
,('1/2/2020','Q1','N' ,null  )     
,('1/3/2020','Q1','N' ,null  )    
,('1/4/2020','Q1','N' ,null  )    
,('1/5/2020','Q1','N' ,null  )
,('1/6/2020','Q1','N' ,null  )
,('1/7/2020','Q2','Y' ,null  )
,('1/8/2020','Q2','N' ,null  )
,('1/9/2020','Q2','N' ,null  )
,('1/10/2020','Q2','N',null  )
,('1/11/2020','Q2','N',null  )
,('1/12/2020','Q2','N',null  )
,('1/13/2020','Q3','Y',null  )


update T
set DaysBeforeQuarter=case when t.FirstDayFlag='Y' 
then 0 else datediff(day,t1.dates,t.dates) end 
from #temp t
cross apply(select top 1 dates 
from #temp t1 where t1.FirstDayFlag='Y'
and t1.Dates>t.dates)t1

select * from #temp

drop table #temp

0
投票

非常感谢您的帮助!您的建议为我提供了一个起点,让我可以开始工作!

这里是我的代码似乎有效。

SELECT
d.CalendarDate as [Date]
,d.AcademicYrQtrCode as [Quarter]
,d.BeginInd as [FirstDayIndicator]
,CASE WHEN d.BeginInd = 'Y' THEN 0 ELSE DATEDIFF (d, d2.CalendarDate, d.CalendarDate) END

FROM DateTable d

JOIN (SELECT * FROM DateTable d WHERE d.BeginInd = 'Y') d2
ON CONVERT (int, d.AcademicYrQtrCode) = CONVERT (int, d2.AcademicYrQtrCode) - 1
© www.soinside.com 2019 - 2024. All rights reserved.