在SQL Server中实现日期

时间:2015-05-05 20:28:28

标签: sql-server date calendar

免责声明:我只是在寻找逻辑而不是代码

约翰发现了一个名叫拉莎的奇怪岛屿。岛上的岁月和周数都很奇怪。他深入了解岛上的日历,发现它类似于世界休息日(ROW)日历,但岛日历的年份从2月的第一周开始# 39; s日历。 John要求你帮他解决将ROW日历转换成Island日历的问题。这是问题所在。

您将获得一个约会(今天的约会)。你必须确定岛周的号码。这里的问题是,岛屿年份从2月的第一周开始,每个岛屿的周从星期日开始,到星期六结束。在SQL Server中编写SQL语句来实现此目的。使用SQL Server函数并设计逻辑。

  • 输入参数:任意日期。
  • 输出参数:Rasa日历中的周数。

以下是一个例子:

  • 日期:2015年5月5日 -
  • 行日历:19
  • Rasa日历中的周数:14

  • 日期:2017年1月1日:

  • 行日历:1
  • Rasa日历中的周数:49

我的问题:这可以在SQL Server中实现吗?

我的作业:我尝试了几种方法来解决问题。

方法#1:

  • 步骤1:计算今天至2月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周。

欢迎任何解决此问题的输入。

1 个答案:

答案 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.如果需要更改解决方案以适应不同的开始日期,则只更改数据,而不是代码。