IF OBJECT_ID('IAS_TEST_SCHEMA.DATESPLIT', 'P') IS NOT NULL
DROP PROCEDURE IAS_TEST_SCHEMA.DATESPLIT;
GO
CREATE PROCEDURE IAS_TEST_SCHEMA.DATESPLIT (@STARTDATE date, @ENDDATE date)
AS
BEGIN
DECLARE @DATEDIFF integer,
@MONTHEND integer = 0,
@MONTHSTART integer = 0,
@STARTWEEK integer = 0,
@ENDWEEK integer = 0;
IF @STARTDATE = CONVERT(date, DATEADD(M, DATEDIFF(M, 0, @STARTDATE), 0))
BEGIN
SET @MONTHSTART = 1;
END
IF MONTH(@ENDDATE) != MONTH(DATEADD(DAY, 1, @ENDDATE))
BEGIN
SET @MONTHEND = 1;
END
IF DATEPART(DW, @STARTDATE) = 2
BEGIN
SET @STARTWEEK = 1;
END
IF DATEPART(DW, @ENDDATE) = 1
BEGIN
SET @ENDWEEK = 1;
END
SET @DATEDIFF = DATEDIFF(DAY, @STARTDATE, @ENDDATE);
SELECT
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @STARTWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
ELSE CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
END
WHEN @DATEDIFF >= 90 THEN CASE
WHEN @MONTHSTART = 1 THEN DATENAME(MONTH, @STARTDATE) + ' ' + DATENAME(YEAR, @STARTDATE)
ELSE CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
END
END AS START_DATE,
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @STARTWEEK = 1 THEN CASE
WHEN @ENDWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
ELSE 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1))) + '/'
+ DATENAME(MONTH, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1)))
END
ELSE CONVERT(varchar, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @STARTDATE), 6)))
END
WHEN @DATEDIFF >= 90 THEN CASE
WHEN @MONTHSTART = 1 THEN CASE
WHEN @MONTHEND = 0 THEN DATENAME(MONTH, DATEADD(MONTH, DATEDIFF(MONTH, -1, @ENDDATE) - 1, -1)) + ' ' + DATENAME(YEAR, DATEADD(MONTH, DATEDIFF(MONTH, -1, @ENDDATE) - 1, -1))
ELSE DATENAME(MONTH, @ENDDATE) + ' ' + DATENAME(YEAR, @ENDDATE)
END
ELSE CONVERT(varchar, CONVERT(date, DATEADD(S, -1, DATEADD(MM, DATEDIFF(M, 0, @STARTDATE) + 1, 0))))
END
END AS END_DATE
UNION
SELECT
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @STARTWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
ELSE 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7)))
END
WHEN @DATEDIFF >= 90 THEN CASE
WHEN @MONTHSTART = 1 THEN DATENAME(MONTH, @STARTDATE) + ' ' + DATENAME(YEAR, @STARTDATE)
ELSE DATENAME(MONTH, CONVERT(date, DATEADD(M, DATEDIFF(M, -1, @STARTDATE), 0))) + ' '
+ DATENAME(YEAR, CONVERT(date, DATEADD(M, DATEDIFF(M, -1, @STARTDATE), 0)))
END
END,
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @ENDWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
ELSE 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1))) + '/'
+ DATENAME(MONTH, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -1)))
END
WHEN @DATEDIFF > 90 THEN CASE
WHEN @MONTHEND = 0 THEN DATENAME(MONTH, CONVERT(date, DATEADD(MONTH, DATEDIFF(MONTH, -1, @ENDDATE) - 1, -1))) + ' '
+ DATENAME(YEAR, CONVERT(date, DATEADD(MONTH, DATEDIFF(MONTH, -1, @ENDDATE) - 1, -1)))
ELSE DATENAME(MONTH, @ENDDATE) + ' ' + DATENAME(YEAR, @ENDDATE)
END
END
UNION
SELECT
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @ENDWEEK = 1 THEN CASE
WHEN @STARTWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 0)))
ELSE 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @STARTDATE), 7)))
END
ELSE CONVERT(varchar, CONVERT(date, DATEADD(WEEK, DATEDIFF(WEEK, 0, @ENDDATE), -0)))
END
WHEN @DATEDIFF >= 90 THEN CASE
WHEN @MONTHEND = 1 THEN DATENAME(MONTH, @STARTDATE) + ' ' + DATENAME(YEAR, @STARTDATE)
ELSE CONVERT(varchar, CONVERT(date, DATEADD(DD, -(DAY(@ENDDATE) - 1), @ENDDATE)))
END
END,
CASE
WHEN @DATEDIFF <= 30 THEN CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
WHEN @DATEDIFF > 30 AND
@DATEDIFF < 90 THEN CASE
WHEN @ENDWEEK = 1 THEN 'WEEK ' + CAST(DATEPART(WEEK, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
- DATEPART(WEEK, DATENAME(YEAR, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) +
'/' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0))) + '/' + '1') AS nvarchar) +
' ' + DATENAME(MONTH, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
ELSE CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
END
WHEN @DATEDIFF >= 90 THEN CASE
WHEN @MONTHEND = 1 THEN DATENAME(MONTH, @ENDDATE) + ' ' + DATENAME(YEAR, @ENDDATE)
ELSE CONVERT(varchar, CONVERT(date, DATEADD(DAY, DATEDIFF(DAY, 0, @ENDDATE), 0)))
END
END
END;
GO
发布与数据样本的预期输出的一个例子。你想按周,按月还是'取决于'输出?这取决于什么? – Paolo
添加了输出...请再次阅读问题 –
好的,现在请提供您输入的输出数据以生成该输出。如果您按照[指导方针](http://stackoverflow.com/help/how-to-ask)提问,那将会更轻松。 – Paolo