Tsql 如何根据日期获得正行和负行

Tsql 如何根据日期获得正行和负行,tsql,Tsql,我正试图从表中获取当前日期。此查询符合我的要求,但似乎有些过分: WITH dates AS (SELECT Month, FQ, FY, MonthDisplay, CAST (datepart(yyyy, [Month]) AS VARCHAR) + '-' + RIGHT(CAST ((datepart(MM, [Month]) + 1

我正试图从表中获取当前日期。此查询符合我的要求,但似乎有些过分:

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];

我认为您可以使用datediff在单个查询中完成这项工作。将当前日期作为一个参数传递,将表日期作为另一个参数传递。如果您可以跳过丢失的日期,这将起作用。例如,如果当前日期为11月21日,则11月20日将显示为-1,11月18日将显示为-3,即使数据中缺少11月19日。我不确定您的业务需求是什么,因此无法对此发表评论

顺便说一句,如果您正在寻找基于月而不是日的条例,您仍然可以使用datediff,但使用正确的datepart请参见:

嗯。
-Tabrez

您可以通过datetime类型变量进行订购,该变量将按照日期值进行订购