SQL Server中的第n天到第n个月

时间:2015-12-08 10:52:32

标签: sql sql-server

我需要在两个日期范围之间获取日期。那是第n个月的第n天。 例如,我需要知道2015年1月1日到2015年12月30日之间每两个月的第23天。

我需要在SQL Server的T-SQL中查询

3 个答案:

答案 0 :(得分:0)

这是你想要实现的目标吗?

DECLARE @startDate datetime
DECLARE @endDate datetime
DECLARE @monthToFind INT
DECLARE @dayToFind INT

SET @startDate = '01/01/2015'
SET @endDate = '12/31/2015'
SET @monthToFind = 2
SET @dayToFind = 20

IF MONTH(@startDate) + (@monthToFind - 1) BETWEEN MONTH(@startDate) AND MONTH(@endDate)
AND YEAR(@startDate) = YEAR(@endDate)
BEGIN
    DECLARE @setTheDate datetime
    SET @setTheDate = CAST(MONTH(@startDate) + (@monthToFind - 1) AS varchar) + '/' + CAST(@dayToFind AS varchar) + '/' + CAST(YEAR(@startDate) AS varchar)

    SELECT DATENAME(DW,@setTheDate)
END

答案 1 :(得分:0)

您应该在MSSQL中使用递归查询。

此处第一个WITH DT是您设置条件的表格:

WITH DT AS
(
  SELECT CAST('January 1, 2015' as datetime) as dStart,
         CAST('December 30, 2015' as datetime) as dFinish,
         31 as nDay,
         2 as nMonth
 ),
 T AS
 (
   SELECT DATEADD(DAY,nDay-1,
                      DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart), 0)
                  ) as d,0 as MonthNumber 
   FROM DT
   UNION ALL
   SELECT DATEADD(DAY,nDay-1,
                      DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart)
                                     +T.MonthNumber+nMonth,0)
                  )as d, T.MonthNumber+nMonth as MonthNumber
         FROM T,DT
         WHERE DATEADD(DAY,nDay-1,
                      DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart)
                                     +T.MonthNumber+nMonth,0)
                  )<=DT.dFinish

 )
 SELECT d FROM T,DT WHERE DAY(d)=DT.nDay

SQLFiddle demo

答案 2 :(得分:0)

这显然是家庭作业,家庭作业的重点是学习如何运作和解决问题,而不是让别人为你做。所以 - 正确执行此操作的指针,而不是复制和粘贴的答案。

  • 数字/计数表非常适合这类事情。创建一个函数,该函数返回范围内的连续整数列表。比日历表更通用,如果需要,可以使用它来导出日历表。
  • 如果你有这个,DATEDIFF会给你两个日期之间的天数。使用它来计算你的范围大小,DATEADD增加你的日期,可能用DATEPART检查日期是否是该月的第n天。

把这些碎片弄乱了一会儿,你就可以解决了。