Sql 显示给定开始和结束日期的天数

Sql 显示给定开始和结束日期的天数,sql,sql-server,ssms,Sql,Sql Server,Ssms,我正在尝试编写一个T-SQL查询,它将列出给定开始日期和结束日期的天数。例如: 开始日期-2014年1月15日 结束日期-2014年3月15日 结果如下所示: Jan 2014 | Feb 2014 | March 2014 ---------------------------------- 15 | 28 | 15 SQL在创建数据方面并不擅长,这意味着如果您需要获取两个日期之间的日期或月份列表,那么SQL实际上必须一次循环并创建一行数据 如果这是一种常见

我正在尝试编写一个T-SQL查询,它将列出给定开始日期和结束日期的天数。例如:

开始日期-2014年1月15日 结束日期-2014年3月15日 结果如下所示:

Jan 2014 | Feb 2014 | March 2014
---------------------------------- 
  15     |    28    |     15

SQL在创建数据方面并不擅长,这意味着如果您需要获取两个日期之间的日期或月份列表,那么SQL实际上必须一次循环并创建一行数据

如果这是一种常见的模式,那么创建一个将每个日期存储为一行的物理表以及关于该日期的各种元数据(月、年、工作日、一年中的一周等)——也就是所谓的日历表,您将受益匪浅

您也可以使用CTE或其他机制制作一个,但使用物理表可能会快得多

假设您有这样一个表,查询将是:

SELECT Month,COUNT(*)
FROM Dates
WHERE Date BETWEEN @StartDate and @EndDate

见我上面关于计算第一个月天数的评论。我假设您希望返回从开始日期开始的当月剩余天数。下面是一个使用测试日期完成此操作的循环:

DECLARE @BeginDate    DATE = '1/15/2014',
        @EndDate      DATE = '3/15/2015',
        @CurrentMonth INT = 0

DECLARE @MonthCounter INT = DATEDIFF(Month, @BeginDate, @EndDate) + 1
DECLARE @Results TABLE (DateValue DATE, NumberOfDays INT)

WHILE @CurrentMonth < @MonthCounter
BEGIN

    IF @CurrentMonth = 0
        BEGIN
            INSERT @Results
            SELECT DATEADD(MONTH,@CurrentMonth,@BeginDate) AS DateValue,
                DAY(EOMONTH(DATEADD(MONTH,@CurrentMonth,@BeginDate))) - DAY(@BeginDate) AS NumberOfDays
        END
    ELSE IF @CurrentMonth = @MonthCounter - 1
        BEGIN
            INSERT @Results
            SELECT DATEADD(MONTH,@CurrentMonth,@BeginDate) AS DateValue,
                DAY(@EndDate) AS NumberOfDays
        END
    ELSE
        BEGIN
            INSERT @Results
            SELECT DATEADD(MONTH,@CurrentMonth,@BeginDate) AS DateValue,
                DAY(EOMONTH(DATEADD(MONTH,@CurrentMonth,@BeginDate))) AS NumberOfDays
        END

    SET @CurrentMonth = @CurrentMonth + 1

END

SELECT DATENAME(Month,DateValue) + ' ' + CONVERT(VARCHAR(10),YEAR(DateValue)) AS [Month], NumberOfDays
FROM @Results

好的,那么您编写了什么T-SQL来尝试实现这一点呢?请用你尝试过的内容编辑你的问题。澄清一下:在你的结果中,一月的数字不应该是16吗,因为一个月有31天?假设您正在计算从开始日期算起的当月剩余天数,您是否已经有日历表?
DECLARE @StartDate AS datetime = '20140115';
DECLARE @EndDate AS datetime = '20140315';

WITH DatesBetweenStartAndEnd AS (
    SELECT @StartDate AS [Date]
  UNION ALL
    SELECT DATEADD(day, 1, [Date])
    FROM DatesBetweenStartAndEnd
    WHERE [Date] < @EndDate
)
SELECT DATENAME(month, [YearMonth]) + ' ' + DATENAME(year, [YearMonth])
      ,COUNT(*)
FROM DatesBetweenStartAndEnd
     CROSS APPLY (
        SELECT DATEADD(day, 1-DAY([Date]), [Date]) AS [YearMonth] 
     ) AS CA1
GROUP BY [YearMonth]
OPTION (MAXRECURSION 0)