最大日期的T-SQL查询少于1(没有视图或临时表)

时间:2016-09-29 15:17:39

标签: tsql sql-server-2008-r2

我目前有一个T-SQL查询,它会提取历史发票日期列表,并使用临时表来阻止第二个到最后一个发票日期。问题是,我需要在第三方应用程序的预处理器中使用此查询,该预处理器在使用创建和删除临时表时效果不佳。有没有办法在不使用View或Temp Table的情况下编写以下T-SQL查询?

SELECT (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS 'DateOnly'
INTO #temp
FROM matter WITH (NOLOCK)
    ,ledger WITH (NOLOCK)
WHERE mclient = '014134'
    AND lmatter = mmatter
    AND lzero != 'R'
    AND mcurrency LIKE '%'
    AND llcode != 'PAY'
GROUP BY ltradat
ORDER BY ltradat

SELECT max(DateOnly)
FROM #temp
WHERE DateOnly < (
        SELECT max(DateOnly)
        FROM #Temp
        )

DROP TABLE #temp

#Temp表格列出了发票日期和与这些发票相关的事项。 select会从列表中将单个发票日期减去1(从最早到最新排序)。

如果我从#Temp中选择*,我会得到一个如下列表:

2016-06-08
2016-07-12
2016-07-26
2016-08-05
2016-09-12

当我运行T-SQL查询的最后一部分时,我得到了我需要的结果:

2016-08-05

是否可以从没有TEMP表或VIEW的单个查询中获取此结果?

提前谢谢。

-Nick

1 个答案:

答案 0 :(得分:1)

您可以使用子查询而不是临时表或视图来获取第二个最新日期吗?像

  SELECT MAX(DateOnly) 
  FROM (
            SELECT TOP 2 (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS DateOnly
            FROM matter WITH (NOLOCK)
                ,ledger WITH (NOLOCK)
            WHERE mclient = '014134'
                AND lmatter = mmatter
                AND lzero != 'R'
                AND mcurrency LIKE '%'
                AND llcode != 'PAY'
            GROUP BY ltradat
            ORDER BY ltradat
       ) AS b