2015-10-05 93 views
1

我有,我有根据选定的日期按月或按周或天显示记录数据。如何获得整月或周或天级的数据在一个查询

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-201515-02-2015。现在,这里还有一个多月,但Feburary是不是在整整一个月,因此januarŸ将记录会在一个和下一首周纪录为Feburary将在一个下周记录中获取将在another`获取。

此外,他一天离开了(因为会有两种每周14日)将有另一record.`

所以,在所有的4 record将是牵强。在这里,而不是整个46天的记录,我只是在记录4条记录。希望我给出了一个适当的例子,如果你不能只是评论我会解释另一个exapmle。我现在只是担心如何分月,一周和一天。任何人都可以帮助我。在此先感谢

我只担心如何在一个月一周或一天的日期分开。该公式很简单,如果整个月份的条目应显示在单个记录中。如果我们之间的日期超过一周,它应该显示周和不到一周它应该在一天级

输入 这里Time_type_id是来自其他3个表的外键。这个time_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 

现在用户刚过,他希望看到的数据,并根据日期,传递我们要的SHO输出中之间的日期。 如果是一个月的水平,我们必须表现出Fact3表,其中Dim_type是3个相同的另外两个表。我只是想如何分割日期

输出 -

对于第二例 -

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天的可能,如果从Thrusday周开始比它不会有7天

+0

发布与数据样本的预期输出的一个例子。你想按周,按月还是'取决于'输出?这取决于什么? – Paolo

+0

添加了输出...请再次阅读问题 –

+0

好的,现在请提供您输入的输出数据以生成该输出。如果您按照[指导方针](http://stackoverflow.com/help/how-to-ask)提问,那将会更轻松。 – Paolo

回答

0

您可以使用两个参数,所以它的动态选择的日期,如:

Declare @FromDate DATETIME, 
     @ToDate DATETIME 

SELECT ... 
FROM ... 
WHERE DATE BETWEEN @FromDate AND @ToDate 
+0

它没有给出任何输出也不要求输入日期 –

0

可以有你的情况下,两个解决方案可供选择:

解决方案#1

你需要一个表/不是Temptable其中包含的数据与像日期,DaySrNo,WeekSrNo,MonthSrNo况且列的所有日期YearSrNo 。在使用该表加入和三个表中获取数据(也加入进来)

解决方案#2 您需要在您现有的表结构的日期范围额外的列: 像在Fact1表包含一天明智数据,所以你需要日期范围列像StartDate和EndDate 相同的方式相同在其他表中的两列Fact2和Fact3

因此,在Join中使用此列并在哪里过滤器可以得到您想要的输出。

0
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

相关问题