经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
获取某一年的母亲节或父亲节日期
来源:cnblogs  作者:Insus.NET  时间:2019/5/13 8:54:12  对本文有异议

 今天是母亲节,它是在每一年的五月份的第二个星期天,而父亲节,是在每一个的六月份的第三个星期天。

把星期天设置为每周的开始,将一周的第一天设置为从 1 到 7 的一个数字。

  1. SET DATEFIRST 7;


参考MSDN:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-datefirst-transact-sql?view=sql-server-2017

然后,我们需要写一个自定义函,获取一年之中所有周别数据:

Week Functionhttps://www.cnblogs.com/insus/archive/2009/12/13/1622988.html

 或者拷贝下面代码即可(稍有修改):

  1. SET ANSI_NULLS ON
  2. GO
  3.  
  4. SET QUOTED_IDENTIFIER ON
  5. GO
  6.  
  7. CREATE FUNCTION [dbo].[svf_Week]
  8. (
  9. @StartYear INT,
  10. @EndYear INT
  11. )
  12. RETURNS @Week TABLE([ID] INT IDENTITY(1,1) PRIMARY KEY,[Year] [INT] NULL,[Week] [INT] NULL,[StartDate] [DATETIME] NULL,[EndDate] [DATETIME] NULL)
  13. AS
  14. BEGIN
  15. DECLARE @StartDateOfYear DATETIME
  16. DECLARE @LastDateOfYear DATETIME
  17. DECLARE @WeekStartDate DATETIME
  18. DECLARE @WeekEndDate DATETIME
  19. DECLARE @Weeks INT
  20.  
  21. WHILE @StartYear <= @EndYear
  22. BEGIN
  23. SET @StartDateOfYear = CAST((CAST(@StartYear AS VARCHAR(4)) + '-01-01') AS DATETIME)
  24. SET @LastDateOfYear= CAST((CAST(@StartYear AS VARCHAR(4))+ '-12-31') AS DATETIME)
  25. SET @Weeks = 1
  26. DECLARE @WeekStartDateOfYear DATETIME
  27. IF DATEPART(DW,@StartDateOfYear) > 4
  28. SET @WeekStartDateOfYear = DATEADD(DAY,(8 - DATEPART(DW,@StartDateOfYear)) ,@StartDateOfYear)
  29. ELSE
  30. SET @WeekStartDateOfYear = DATEADD(DAY,(-(DATEPART(DW,@StartDateOfYear)-1)),@StartDateOfYear)
  31. SET @WeekStartDate = @WeekStartDateOfYear
  32. SET @WeekEndDate = DATEADD(DAY,6,@WeekStartDate)
  33. WHILE DATEDIFF(DAY,@WeekStartDate,@LastDateOfYear) >= 4
  34. BEGIN
  35. INSERT INTO @Week([Year],[Week],[StartDate],[EndDate]) VALUES (@StartYear,@Weeks,@WeekStartDate,@WeekEndDate)
  36. SET @Weeks = @Weeks + 1
  37. SET @WeekStartDate = @WeekStartDate + 7
  38. SET @WeekEndDate = @WeekEndDate + 7
  39. END
  40. SET @StartYear = @StartYear + 1
  41. END
  42. RETURN
  43. END
  44. GO
Source Code

 
把这个要求,写成一个自定义函数,方便用在程序应用即可。

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. -- =============================================
  6. -- Author: Insus.NET
  7. -- Create date: 2019-05-12
  8. -- Update date: 2019-05-12
  9. -- Description: 获取母亲节或父亲节日期
  10. -- =============================================
  11. CREATE FUNCTION [dbo].[svf_Parents_Festival]
  12. (
  13. @StartYear INT,
  14. @EndYear INT
  15. )
  16. RETURNS @tempTable TABLE([ID] INT IDENTITY(1,1) PRIMARY KEY,[Year] [INT] NOT NULL,[Mother's Day] [DATETIME] NULL,[Father's Day] [DATETIME] NULL)
  17. AS
  18. BEGIN
  19. DECLARE @Weeks AS TABLE([Year] INT,[StartDateOfWeek] DATETIME)
  20. INSERT INTO @Weeks ([Year],[StartDateOfWeek]) SELECT [Year],[StartDate] FROM [dbo].[svf_Week] (@StartYear,@EndYear)
  21. WHILE @StartYear <= @EndYear
  22. BEGIN
  23. INSERT INTO @tempTable ([Year]) VALUES(@StartYear)
  24. UPDATE @tempTable SET [Mother's Day] = (
  25. SELECT [StartDateOfWeek] FROM (
  26. SELECT ROW_NUMBER() OVER (ORDER BY [StartDateOfWeek] ASC) AS [RowNumber], [StartDateOfWeek] FROM @Weeks
  27. WHERE [Year] = @StartYear AND MONTH([StartDateOfWeek]) = 5) AS m
  28. WHERE [RowNumber] = 2)
  29. WHERE [Year] = @StartYear
  30.  
  31. UPDATE @tempTable SET [Father's Day] = (
  32. SELECT [StartDateOfWeek] FROM (
  33. SELECT ROW_NUMBER() OVER (ORDER BY [StartDateOfWeek] ASC) AS [RowNumber], [StartDateOfWeek] FROM @Weeks
  34. WHERE [Year] = @StartYear AND MONTH([StartDateOfWeek]) = 6) AS f
  35. WHERE [RowNumber] = 3)
  36. WHERE [Year] = @StartYear
  37.  
  38. SET @StartYear = @StartYear + 1
  39. END
  40.  
  41. RETURN
  42. END
Source Code

 

下面代码年份,看看得到的日期是否正确:

 

原文链接:http://www.cnblogs.com/insus/p/10851432.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号