免责声明:我只是在寻找逻辑而不是代码
约翰发现了一个名叫拉莎的奇怪岛屿。岛上的岁月和周数都很奇怪。他深入了解岛上的日历,发现它类似于世界休息日(ROW)日历,但岛日历的年份从2月的第一周开始# 39; s日历。 John要求你帮他解决将ROW日历转换成Island日历的问题。这是问题所在。您将获得一个约会(今天的约会)。你必须确定岛周的号码。这里的问题是,岛屿年份从2月的第一周开始,每个岛屿的周从星期日开始,到星期六结束。在SQL Server中编写SQL语句来实现此目的。使用SQL Server函数并设计逻辑。
以下是一个例子:
Rasa日历中的周数:14
日期:2017年1月1日:
我的问题:这可以在SQL Server中实现吗?
我的作业:我尝试了几种方法来解决问题。
方法#1:
第2步:将其除以7并将结果加1。
后来发现,如果2月1日是星期日以外的任何一天,这种做法将不起作用。
例如:2月1日是星期三。 2月5日将在周一
因此,2月1日是在Rasa的第1周,2月5日是在Rasa的第2周。根据我的方法,第1和第5个feb在第1周是不正确的。
方法#2:
我认为从ROW的日历中删除Jan的5周应该有效
select
case
when f.RasaWeek = -4 then 48
when f.RasaWeek = -3 then 49
when f.RasaWeek = -2 then 50
when f.RasaWeek = -1 then 51
when f.RasaWeek = 0 then 52
else
f.RasaWeek
end as Rasa_week,
f.year, f.month, f.date
from
(select
datepart(wk, date) - 5 as RasaWeek, *
from
<datetable>
where
Year(date) in (2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018)) as f
信息:我在<datetable>
上对此进行了测试,但如果有第53周,此代码将会中断。请注意,我无法照顾第53周。
欢迎任何解决此问题的输入。
答案 0 :(得分:0)
使用日期,制作日历表并存储您关心的数据几乎总是更容易,而不是尝试做除基本日期算术之外的任何事情。使用SQL的优势:存储和检索数据。
在这种情况下,你关心的是2月份的所有第一个星期日。如果将这些日期存储在表中,解决方案是:
RETURN
SELECT TOP 1
DATEDIFF(day,[date],@input_date) / 7
FROM IslandCalendarStartDates
WHERE [date] <= @input
ORDER BY [date] DESC
这样您就不必担心闰年或53周,或任何边缘情况。只计算2月份最近一个星期日的天数除以7.如果需要更改解决方案以适应不同的开始日期,则只更改数据,而不是代码。