Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在单个查询中获取整个月、周或日级别的数据_Sql Server_Sql Server 2008 - Fatal编程技术网

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(月份,转换日期,日期)