SQL Server查询:获取InsertDTS最大日期的记录(忽略时间)
解决SQL Server获取最大日期所有记录的问题
原查询仅能获取最新时间点的单条(或同时间)记录,因为MAX(InsertDTS)会包含具体时间。要忽略时间部分、获取最大日期对应的所有记录,可采用以下几种方案:
方案一:直接转换为DATE类型
通过CAST将InsertDTS转换为日期类型,匹配子查询中得到的最大日期:
SELECT [Payer], [File], [Data_Rows], [Amt_Billed], [Amt_Paid] FROM [Customer].[dbo].[Billing] WHERE CAST(InsertDTS AS DATE) = (SELECT CAST(MAX(InsertDTS) AS DATE) FROM [Customer].[dbo].[Billing])
优点:代码简洁直观;缺点:若InsertDTS列存在索引,CAST会导致索引失效,大表查询性能可能受影响。
方案二:利用日期区间匹配(性能更优)
通过DATEADD和DATEDIFF截断时间,构造最大日期的起始和结束区间,避免函数破坏索引:
SELECT [Payer], [File], [Data_Rows], [Amt_Billed], [Amt_Paid] FROM [Customer].[dbo].[Billing] WHERE InsertDTS >= (SELECT DATEADD(DAY, DATEDIFF(DAY, 0, MAX(InsertDTS)), 0) FROM [Customer].[dbo].[Billing]) AND InsertDTS < (SELECT DATEADD(DAY, DATEDIFF(DAY, 0, MAX(InsertDTS)) + 1, 0) FROM [Customer].[dbo].[Billing])
原理:先算出最大日期的00:00:00起始时间,再取第二天的00:00:00作为结束边界,匹配该区间内的所有记录,可正常利用InsertDTS上的索引。
方案三:用CTE简化重复子查询
若觉得子查询重复冗余,可使用公共表表达式(CTE)提前计算最大日期:
WITH MaxDateCTE AS ( SELECT DATEADD(DAY, DATEDIFF(DAY, 0, MAX(InsertDTS)), 0) AS MaxDate FROM [Customer].[dbo].[Billing] ) SELECT [Payer], [File], [Data_Rows], [Amt_Billed], [Amt_Paid] FROM [Customer].[dbo].[Billing] CROSS JOIN MaxDateCTE WHERE InsertDTS >= MaxDateCTE.MaxDate AND InsertDTS < DATEADD(DAY, 1, MaxDateCTE.MaxDate)
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

