2015-10-05 3 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-2015 к 15-02-2015. Теперь здесь больше месяца, но Feburary не в течение всего месяца, поэтому januar y будет записываться в одну и последующие записи за первую неделю для Feburary, которые будут отобраны в течение одной и следующей недели.

Также он оставил день (как там будет 14 дней на две недели) будет иметь еще один record.`

Таким образом, во всех 4 record будет неправдоподобным. Здесь вместо того, чтобы заниматься целым 46-дневным альбомом, я просто разбираюсь в 4 записях. Надеюсь, я привел правильный пример, если вы не можете просто прокомментировать, я объясню другим примером. Сейчас я просто беспокоюсь о том, как разделить месяц, неделю и день. Может ли кто-нибудь помочь мне в этом. Заранее спасибо

Меня беспокоит только то, как разделить даты в месяц или день. Формула проста, если в течение всего месяца запись должна быть показана в одной записи. Если мы находимся между более чем неделями, это должно быть указано неделю, а меньше недели должно быть на уровне дня

Ввод Здесь Time_type_id - это внешний ключ из других 3 таблиц. Этот time_type_id поможет получить данные день, неделя или месяц. Данные отображаются в соответствии с датой, переданной пользователем. Time_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_type 3 одинаково для других двух таблиц. Я просто хочу, как разделить дату

output-

Для второго ПРИМЕР-

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

ok, теперь, пожалуйста, предоставьте входные данные, над которыми вы работаете, для производства этого вывода. было бы проще, если вы будете следовать [рекомендациям] (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 ,Используйте эту таблицу в регистрации и получить данные из трех таблиц (которые также в JOIN)

Решение # 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

Смежные вопросы