Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL server中创建月的星期和星期的日期_Sql Server_Tsql_Date - Fatal编程技术网

Sql server 在SQL server中创建月的星期和星期的日期

Sql server 在SQL server中创建月的星期和星期的日期,sql-server,tsql,date,Sql Server,Tsql,Date,我必须从SQL server中用户输入的每月的一周(该月的周数-第一、第二、第三、第四和最后一周)和每周的一天(星期日、星期一..)中获取/创建日期 示例: 每月第4个星期日、每月最后一个星期五、第一个星期一等 我可以在.net中轻松地完成这项工作,但SQL server似乎在日期函数方面受到了限制 我得用很多逻辑来确定日期。为了使用上述两个参数计算日期,我必须使用大量的datepart函数 关于如何为这样一个函数提供最佳SQL查询,有什么建议吗?我前几天为另一个操作创建了一个函数 此函数将当前

我必须从SQL server中用户输入的每月的一周(该月的周数-第一、第二、第三、第四和最后一周)和每周的一天(星期日、星期一..)中获取/创建日期

示例: 每月第4个星期日、每月最后一个星期五、第一个星期一等

我可以在.net中轻松地完成这项工作,但SQL server似乎在日期函数方面受到了限制

我得用很多逻辑来确定日期。为了使用上述两个参数计算日期,我必须使用大量的datepart函数


关于如何为这样一个函数提供最佳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的东西,但更多的是一个深入的版本。我自己尝试过这个,它工作得很好(两种情况下)。这是一个易于理解和可重用的解决方案。大多数美国假日都是以一个月中的周数为基础的,所以这个功能非常方便。