我必须从一周的的用户输入中获取/创建日期(该月的周数 - 第1,第2,第3,第4和最后一个)和星期几< / strong>(星期日,星期一..)在SQL服务器中。
实施例: 每个月的第4个星期日,每个月的最后一个星期一,第一个星期一等等。
我能够在.net中轻松完成,但SQL服务器似乎在日期函数中有限。
我不得不使用大量逻辑来获取日期。要使用上述两个参数计算日期,我必须使用大量的datepart函数。
有关如何为这样的函数提出最佳SQL查询的任何建议吗?
答案 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
)