在SQL Server中创建月份周和星期几的日期

时间:2015-08-31 21:34:20

标签: sql-server tsql date

我必须从一周的的用户输入中获取/创建日期(该月的周数 - 第1,第2,第3,第4和最后一个)和星期几< / strong>(星期日,星期一..)在SQL服务器中。

实施例: 每个月的第4个星期日,每个月的最后一个星期一,第一个星期一等等。

我能够在.net中轻松完成,但SQL服务器似乎在日期函数中有限。

我不得不使用大量逻辑来获取日期。要使用上述两个参数计算日期,我必须使用大量的datepart函数。

有关如何为这样的函数提出最佳SQL查询的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我在另一天为另一个OP GET Month, Quarter based on Work Week number

创建了一个函数

此功能将当前年份作为默认值,可以进一步修改以将Year作为参数。

该功能的扩展可以产生您正在寻找的结果....

WITH X AS
(
SELECT TOP (CASE WHEN YEAR(GETDATE()) % 4 = 0 THEN 366 ELSE 365 END)-- to handle leap year 
      DATEADD(DAY 
             ,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1
             , CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '0101' )      
                      DayNumber
  From master..spt_values
 ),DatesData AS(
SELECT DayNumber [Date]
      ,DATEPART(WEEKDAY,DayNumber) DayOfTheWeek
      ,DATEDIFF(WEEK, 
            DATEADD(WEEK, 
               DATEDIFF(WEEK, 0, DATEADD(MONTH, 
                           DATEDIFF(MONTH, 0, DayNumber), 0)), 0)
              , DayNumber- 1) + 1 WeekOfTheMonth
FROM X )
SELECT * FROM DatesData
WHERE DayOfTheWeek   = 6  -- A function would expect these two parameters
 AND  WeekOfTheMonth = 4  -- @DayOfTheWeek and @WeekOfTheMonth 

答案 1 :(得分:0)

这是一个通用公式:

declare @month as datetime --set to the first day of the month you wish to use
declare @week as int  --1st, 2nd, 3rd...
declare @day as int   --Day of the week (1=sunday, 2=monday...)

--Second monday in August 2015
set @month = '8/1/2015'
set @week = 2
set @day = 2

select dateadd(
    day,
    ((7+@day) - datepart(weekday, @month)) % 7 + 7 * (@week-1),
    @month
    )

您还可以使用此反向公式找到最后一个,倒数第二个......等等:

--Second to last monday in August 2015
set @month = '8/1/2015'
set @week = 2
set @day = 2

select
    dateadd(
    day,
    -((7+datepart(weekday, dateadd(month,1,@month)-1)-@day)) % 7 - 7 * (@week-1),
    dateadd(month,1,@month)-1
    )