在SQL Server中返回最大日期

时间:2015-07-22 14:24:12

标签: sql sql-server tsql select stored-procedures

我正在尝试返回输入日期的最长日期。

CREATE PROCEDURE [dbo].[getMaxMonthDate]
    @from datetime,
    @to datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT MAX(DAY(ds.datum)) AS DayMax,
           MONTH(ds.datum) AS MonthMax,
           YEAR(ds.datum) AS YearMax,
           CAST(CONVERT(varchar, YEAR(ds.datum)) + '-' + CONVERT(varchar, MONTH(ds.datum)) + '-' + CONVERT(varchar, MAX(DAY(ds.datum))) AS DATETIME) AS DateMax

    FROM QR_DS022s ds
    WHERE ds.datum >= @from AND ds.datum <= @to
    GROUP BY MONTH(ds.datum), YEAR(ds.datum), ds.datum
END

例如我在打字时

@from='2014-01-01'@to='2014-04-01'然后查询结果如下:

DayMax | MonthMax | YearMax | DateMax
========================================
  31   |    1     |   2014  | 2014-01-31
  28   |    2     |   2014  | 2014-02-28
  31   |    3     |   2014  | 2014-03-31
  01   |    4     |   2014  | 2014-04-01

目前我正在收到所有日期,但我只想要一个月的最后一个日期。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

WHERE添加一个额外的子句,具体取决于逻辑更改的sql版本

对于SQL2012,请使用EOMONTH

...
WHERE ds.datum >= @from AND ds.datum <= @to
AND EOMONTH(ds.datum) = ds.datum
...

Pre-SQL2012在当天添加一个并在同一个月检查

...
WHERE ds.datum >= @from AND ds.datum <= @to
AND MONTH(DATEADD(day,1,ds.datum)) != MONTH(ds.datum)
...

答案 1 :(得分:1)

将ds.datum从GROUP BY中删除。

答案 2 :(得分:1)

如果您希望使用问题中的方法获得最长日期,则需要进行多项更改。例如,您的@to值不会在2014-04-01&#39;中返回30,因为您只考虑了一天。

我认为以下方法可行,使用您的方法:

SELECT MAX(DAY(ds.datum)) AS DayMax,
       MONTH(ds.datum) AS MonthMax,
       YEAR(ds.datum) AS YearMax,
       CONVERT(VARCHAR(10), MAX(ds.datum), 120) as DateMax
FROM QR_DS022s ds
WHERE ds.datum >= @from AND
      ds.datum <= DATEADD(month, 1, @to)
GROUP BY MONTH(ds.datum), YEAR(ds.datum)
HAVING (YEAR(ds.datum) < YEAR(@to) OR MONTH(ds.datum <= MONTH(@to));

有关更改的说明:

  • 只需使用内置的convert()即可获得所需的格式。
  • 永远不要在SQL Server中使用varchar没有长度。默认长度因上下文而异,很难找到与长度相关的错误。
  • 这会增加一个月,以确保查询考虑最后一天。
  • HAVING子句删除了额外的月份。

而且,在SQL Server 2012+中,使用内置的EOMONTH()函数可以更加简单。

答案 3 :(得分:0)

我已经修改了我的答案以满足您的需求。

DECLARE @temp TABLE (Jagg DATE)
DECLARE @startdate DATE
SET @startdate = '1/1/2014'
WHILE (@startdate <= '4/1/2014')
BEGIN
INSERT INTO @temp(Jagg)
VALUES ((CAST(DATEADD(MONTH, DATEDIFF(MONTH,0,@startdate)+1,0)-1 AS DATE)))
SET @startdate = DATEADD(MONTH,1,@startdate)
END
SELECT * FROM @temp