如何根据日期获得正负行

时间:2011-11-15 00:45:59

标签: tsql

我正试图从表格中获取当前日期的条例。这个查询做了我想要的但看起来有点过分了:

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 :(得分:0)

我认为您可以使用datediff在单个查询中执行此操作。将当前日期作为一个参数传递,将表日期作为另一个参数。如果您可以跳过缺少的日期,这将有效。例如,如果当前日期是11月21日,则11月20日将显示为-1,而11月18日将显示为-3,即使数据中缺少11月19日。我不确定您的业务需求是什么,所以不能发表评论。

顺便说一句,如果您正在寻找基于月而不是白天的条例,您可以使用仍然使用datediff但使用正确的日期部分(参见:http://msdn.microsoft.com/en-us/library/ms189794.aspx)。

HTH。 -Tabrez