You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:27:42