Sql server 在SQL server中创建月的星期和星期的日期
我必须从SQL server中用户输入的每月的一周(该月的周数-第一、第二、第三、第四和最后一周)和每周的一天(星期日、星期一..)中获取/创建日期 示例: 每月第4个星期日、每月最后一个星期五、第一个星期一等 我可以在.net中轻松地完成这项工作,但SQL server似乎在日期函数方面受到了限制 我得用很多逻辑来确定日期。为了使用上述两个参数计算日期,我必须使用大量的datepart函数Sql server 在SQL server中创建月的星期和星期的日期,sql-server,tsql,date,Sql Server,Tsql,Date,我必须从SQL server中用户输入的每月的一周(该月的周数-第一、第二、第三、第四和最后一周)和每周的一天(星期日、星期一..)中获取/创建日期 示例: 每月第4个星期日、每月最后一个星期五、第一个星期一等 我可以在.net中轻松地完成这项工作,但SQL server似乎在日期函数方面受到了限制 我得用很多逻辑来确定日期。为了使用上述两个参数计算日期,我必须使用大量的datepart函数 关于如何为这样一个函数提供最佳SQL查询,有什么建议吗?我前几天为另一个操作创建了一个函数 此函数将当前
关于如何为这样一个函数提供最佳SQL查询,有什么建议吗?我前几天为另一个操作创建了一个函数 此函数将当前年份作为默认值,还可以进一步修改,将年份作为参数 对该函数的扩展可以产生您想要的结果
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
下面是一个通用公式:
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
)
如果您使用的是sql server 2012及更高版本,请查看
DATEFROMPARTS()
函数。你是否考虑过使用你已经拥有的.NET代码?@ DhruvJoshi -是的,我确实阅读过它,但是它需要年、月和日期作为参数。我需要的是类似DateFromParts的东西,但更多的是一个深入的版本。我自己尝试过这个,它工作得很好(两种情况下)。这是一个易于理解和可重用的解决方案。大多数美国假日都是以一个月中的周数为基础的,所以这个功能非常方便。