Sql server 如何在单个查询中获取整个月、周或日级别的数据
我有一个数据,其中我必须根据所选日期按月、周或日显示记录Sql server 如何在单个查询中获取整个月、周或日级别的数据,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个数据,其中我必须根据所选日期按月、周或日显示记录 If the date selected is for a whole month for like january its 01-01-2015 to 31-01-2015 then it should fetch for the record for the whole month. 如果所选日期如01-01-2015至15-02-2015。现在这里有一个多月,但Feburary不在整个月内,因此january将记录在一个月内,而
If the date selected is for a whole month for like january its 01-01-2015 to 31-01-2015
then it should fetch for the record for the whole month.
如果所选日期如01-01-2015
至15-02-2015
。现在这里有一个多月,但Feburary
不在整个月内,因此januar
y将记录在一个月内,而Feburary
的第一周记录将在一个月内提取,下周记录将在另一个月内提取
此外,他离开的那一天(第二周将有14天)将有另一个记录`
因此,在所有4条记录中,
将被提取。在这里,我不是在浪费46天的时间,而是在浪费4天的时间。希望我给出了一个恰当的例子,如果你不能只是评论,我会用另一个例子来解释。我现在只担心如何划分月、周和日。有人能帮我吗。提前谢谢
我只担心如何将日期分为月、周或日。公式很简单,如果e有整月,则条目应显示在单个记录中。如果我们的日期介于超过一周和少于一周之间,则应显示为“周”级别
输入
这里,Time_type_id是来自其他3个表的外键。这一次_type _id将有助于按天、周或月获取数据。数据根据用户传递的日期显示。Time_id是表的主键,它指向其他3个事实表的id
Dimesion Table
Time_type_id Time_id metric_id
1 1 100
1 2 400
1 3 300
1 4 100
1 5 250
2 6 1000
2 7 2000
2 8 3000
2 9 2000
2 10 5000
3 11 11000
3 12 20000
3 13 40000
3 14 50000
3 15 60000
Fact table
Fact1- This shows the day basis data.
Dim_type Id day_date month year
1 1 01-09-2015 September 2015
1 2 02-09-2015 September 2015
1 3 03-09-2015 September 2015
1 4 04-09-2015 September 2015
1 5 05-09-2015 September 2015
Fact2- This shows the weekly basis data.
Dim_type Id week_number month year
2 6 week1 September 2015
2 7 week2 September 2015
2 8 week3 September 2015
2 9 week4 September 2015
2 10 week1 October 2015
Fact3- This shows the monthly basis data.
Dim_type Id month year
3 11 September 2015
3 12 September 2015
3 13 September 2015
3 14 September 2015
3 15 October 2015
现在用户只是传递了他想要查看数据的日期,根据传递的日期,我们必须输出数据。
如果是月级别,我们必须显示Fact3表格,其中Dim_类型与其他两个表格相同。我只想知道如何分割日期
输出-
第二个例子-
Sr no id data (from the date range)
1 1 data from whole January
2 2 data from first week of Feburary
3 3 data from second week of Feburary
4 4 data from 15 Febuaray
注意:不要让一周总是有7天,如果一周从星期四开始,那么它就不会有7天。您可以使用两个参数,因此选择日期是动态的,例如:
Declare @FromDate DATETIME,
@ToDate DATETIME
SELECT ...
FROM ...
WHERE DATE BETWEEN @FromDate AND @ToDate
您可以使用两个参数,因此选择日期是动态的,如:
Declare @FromDate DATETIME,
@ToDate DATETIME
SELECT ...
FROM ...
WHERE DATE BETWEEN @FromDate AND @ToDate
在您的情况下,可以有两种解决方案: 解决方案#1 您需要一个table/tentable,其中包含所有日期的数据,包括Date、DaySrNo、WeekSrNo、MonthSrNo和YearSrNo等列。在Join中使用此表,并在三个表(也在Join中)中获取数据 解决方案#2 现有表结构中的日期范围需要额外的列: 和Fact1一样,表包含按天计算的数据,所以您需要像StartDate和EndDate这样的日期范围列 同样,其他表Fact2和Fact3中有相同的两列
因此,在Join and where filter中使用此列可以获得所需的输出。在您的情况下,有两种解决方案:
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;
解决方案#1
您需要一个table/tentable,其中包含所有日期的数据,包括Date、DaySrNo、WeekSrNo、MonthSrNo和YearSrNo等列。在Join中使用此表,并在三个表(也在Join中)中获取数据
解决方案#2
现有表结构中的日期范围需要额外的列:
和Fact1一样,表包含按天计算的数据,所以您需要像StartDate和EndDate这样的日期范围列
同样,其他表Fact2和Fact3中有相同的两列
因此,在Join和where筛选器中使用此列可以获得所需的输出。如果对象ID('IAS\u TEST\u SCHEMA.DATESPLIT','p')不为空
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;
删除过程IAS_TEST_SCHEMA.DATESPLIT;
去
创建过程IAS_TEST_SCHEMA.DATESPLIT(@STARTDATE-date,@ENDDATE-date)
作为
开始
声明@DATEDIFF整数,
@MONTHEND整数=0,
@MONTHSTART整数=0,
@STARTWEEK整数=0,
@周末整数=0;
如果@STARTDATE=CONVERT(日期,DATEADD(M,DATEDIFF(M,0,@STARTDATE),0))
开始
设置@MONTHSTART=1;
结束
如果月份(@ENDDATE)!=月份(DATEADD(第1天,@ENDDATE))
开始
设置@MONTHEND=1;
结束
如果DATEPART(DW,@STARTDATE)=2
开始
设置@STARTWEEK=1;
结束
如果DATEPART(DW,@ENDDATE)=1
开始
设置@ENDWEEK=1;
结束
设置@DATEDIFF=DATEDIFF(天、@STARTDATE、@ENDDATE);
挑选
案例
当@DATEDIFF 30和
@DATEDIFF<90则情况
当@STARTWEEK=1时,则为'WEEK'+CAST(日期部分(WEEK,CONVERT(date,DATEADD(DAY,DATEDIFF(DAY,0,@STARTDATE),0)))
-DATEPART(周,DATENAME(年,转换为日期,DATEADD(日,DATEDIFF(日,0,@STARTDATE),0)))+
“/”+DATENAME(月,转换(日期,DATEADD(DAY,DATEDIFF(DAY,0,@STARTDATE),0))+“/”+“1”)为nvarchar)+
''+DATENAME(月,转换(日期,DATEADD(天,DATEDIFF(天,0,@STARTDATE),0)))
ELSE CONVERT(varchar,CONVERT(date,DATEADD(DAY,DATEDIFF(DAY,0,@STARTDATE),0)))
结束
当@DATEDIFF>=90时,则为大小写
当@MONTHSTART=1时,则DATENAME(月,@STARTDATE)+''+DATENAME(年,@STARTDATE)
ELSE CONVERT(varchar,CONVERT(date,DATEADD(DAY,DATEDIFF(DAY,0,@STARTDATE),0)))
结束
结束日期为开始日期,
案例
当@DATEDIFF 30和
@DATEDIFF<90则情况
当@STARTWEEK=1时,则为1
当@ENDWEEK=1时,则为“WEEK”+CAST(日期部分(WEEK,CONVERT(date,DATEADD(DAY,DATEDIFF(DAY,0,@ENDDATE),0)))
-DATEPART(周,DATENAME(年,转换为日期,DATEADD(天,DATEDIFF(天,0,@ENDDATE),0)))+
“/”+DATENAME(月,转换(日期,DATEADD(DAY,DATEDIFF(DAY,0,@ENDDATE),0))+“/”+“1”)为nvarchar)+
''+DATENAME(月,转换(日期,DATEADD(天,DATEDIFF(天,0,@ENDDATE),0)))
ELSE“WEEK”+CAST(日期部分(WEEK,CONVERT(日期,DATEADD(WEEK,DATEDIFF(WEEK,0,@ENDDATE),-1)))
-DATEPART(WEEK,DATENAME(YEAR,CONVERT(日期,DATEADD(WEEK,DATEDIFF(WEEK,0,@ENDDATE),-1))+“/”
+DATENAME(月份,转换日期,日期)