SQL Server中如何比较两个日期?能否将表中日期与当前日期对比?
SQL Server 日期对比实操指南
嘿,这个问题我太熟了!在SQL Server里处理日期对比其实挺直接的,不管是两个存储的日期互比,还是和当前日期对比,都有很成熟的做法,我给你掰扯清楚:
一、两个日期的基础对比
SQL Server里的日期类型(比如datetime、datetime2、date这些)支持直接用常规的比较运算符,像=、>、<、>=、<=、<>都能用。举个简单例子,假设你有个表Projects,里面有StartDate和EndDate两个日期列,要找项目开始时间早于结束时间的记录,直接写:
SELECT * FROM Projects WHERE StartDate < EndDate;
要是你只需要对比日期部分(忽略时分秒),可以把日期转成date类型再比,这样就不会被时间干扰:
-- 只比较年月日,不管具体几点几分 SELECT * FROM Projects WHERE CAST(StartDate AS DATE) = CAST(EndDate AS DATE);
二、存储日期与当前日期的对比
当然可以实现!SQL Server提供了好几个内置函数来获取当前系统的日期时间,你可以根据需求选:
GETDATE():返回当前系统的日期+时间(datetime类型,精度到毫秒)SYSDATETIME():返回更精确的日期时间(datetime2类型,精度到纳秒,适合用datetime2列的场景)CURRENT_TIMESTAMP:和GETDATE()功能完全一致,是ANSI标准写法,兼容性更好CAST(GETDATE() AS DATE):只获取当前的年月日(不带时间)
给你几个实用的例子:
- 查找今天之前创建的订单:
SELECT * FROM Orders WHERE OrderDate < GETDATE();
- 查找今天当天的订单(不管下单时间):
SELECT * FROM Orders WHERE CAST(OrderDate AS DATE) = CAST(GETDATE() AS DATE);
- 查找最近7天内的订单:
SELECT * FROM Orders WHERE OrderDate >= DATEADD(DAY, -7, GETDATE());
小提示
- 如果你的列是
datetime2类型,优先用SYSDATETIME(),精度匹配更合理; - 要是需要跨数据库兼容,
CURRENT_TIMESTAMP是更好的选择; - 对比日期时尽量避免在列上做函数运算(比如
CAST(OrderDate AS DATE)),如果数据量很大,可能会影响索引效率——可以考虑把当前日期转成带时间的范围来写,比如WHERE OrderDate >= '2024-05-20' AND OrderDate < '2024-05-21',这样能利用索引。
内容的提问来源于stack exchange,提问作者Arges Hajderlli




