我正在尝试返回输入日期的最长日期。
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
目前我正在收到所有日期,但我只想要一个月的最后一个日期。我该如何解决这个问题?
答案 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()
即可获得所需的格式。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