Как вы получаете положительные и отрицательные строки на основе даты - PullRequest
1 голос
/ 15 ноября 2011

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

WITH     dates
AS       (SELECT Month,
                 FQ,
                 FY,
                 MonthDisplay,
                 CAST (datepart(yyyy, [Month]) AS VARCHAR) + '-' + RIGHT(CAST ((datepart(MM, [Month]) + 100) AS VARCHAR), 2) AS YM,
                 fh,
                 LEFT(CONVERT (VARCHAR, [Month], 100), 3) + ' ' + RIGHT(fy, 4) AS MY,
                 LEFT(CONVERT (VARCHAR, [Month], 100), 3) AS ShortMonthName
          FROM   Pipeline.DimTime AS dt),
         datesafter
AS       (SELECT dt.FH,
                 dt.FQ,
                 dt.FY,
                 dt.MY,
                 dt.Month,
                 dt.MonthDisplay,
                 dt.ShortMonthName,
                 dt.YM,
                 ROW_NUMBER() OVER ( ORDER BY [Month]) AS RowNum
          FROM   dates AS dt
          WHERE  dt.[Month] >= (SELECT TOP 1 DATEADD(MONTH, DATEDIFF(MONTH, 0, ds.SnapshotDate), 0)
                                FROM   dbo.vw_DimSnapshot AS ds
                                WHERE  ds.SnapshotWeek = 'Current')),
         datesbefore
AS       (SELECT dt.FH,
                 dt.FQ,
                 dt.FY,
                 dt.MY,
                 dt.Month,
                 dt.MonthDisplay,
                 dt.ShortMonthName,
                 dt.YM,
                 (ROW_NUMBER() OVER ( ORDER BY [Month] DESC)) * -1 AS RowNum
          FROM   dates AS dt
          WHERE  dt.[Month] < (SELECT TOP 1 DATEADD(MONTH, DATEDIFF(MONTH, 0, ds.SnapshotDate), 0)
                               FROM   dbo.vw_DimSnapshot AS ds
                               WHERE  ds.SnapshotWeek = 'Current'))
SELECT   *
FROM     datesafter
UNION ALL
SELECT   *
FROM     datesbefore
ORDER BY [month];

1 Ответ

0 голосов
/ 21 ноября 2011

Я думаю, что вы можете сделать это в одном запросе, используя datediff.Передайте текущую дату как один параметр, а дату таблицы - как другой.Это будет работать, если вы в порядке с пропуском пропущенных дат.Например, если текущая дата 21 ноября, то 20 ноября будет отображаться как -1, а 18 ноября - как -3, даже если в данных отсутствует 19 ноября.Я не уверен, каковы ваши требования к бизнесу, поэтому не могу комментировать дальше.

И, кстати, если вы ищете постановление по месяцам, а не по дню, вы можете по-прежнему использовать datediff, но использовать правильную часть даты(См .: http://msdn.microsoft.com/en-us/library/ms189794.aspx).

HTH. -Tabrez

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...