如何比较两个日期时间字段但忽略年份?

时间:2008-10-21 20:41:34

标签: tsql

我搞掉了我的VBScript帽子并写了一些经典的ASP来查询SQL Server 2000数据库。

以下是该方案:

  • 我有两个 datetime 字段,名为 fieldA fieldB
  • fieldB 的年份值永远不会超过 fieldA 的年份
  • 可能两个字段的年份相同。

我想要的是 fieldA > = fieldB 独立于年份的所有记录。假装每个领域只有一个月和一个月。一天。

我怎么能得到这个?我对T-SQL日期/时间函数的了解充其量只是参差不齐。

5 个答案:

答案 0 :(得分:14)

您可能希望使用内置时间功能,例如DAY和MONTH。 e.g。

SELECT * from table where
MONTH(fieldA) > MONTH(fieldB) OR(
MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB))

选择fieldA的月份较大或月份相同且fieldA的日期较大的所有行。

答案 1 :(得分:3)

select *
from t
where datepart(month,t.fieldA) >= datepart(month,t.fieldB)
      or (datepart(month,t.fieldA) = datepart(month,t.fieldB)
            and datepart(day,t.fieldA) >= datepart(day,t.fieldB))

如果您关心小时,分钟,秒,则需要延长此时间以覆盖案例,尽管将其转换为合适的字符串可能会更快,删除年份并进行比较。

select *
from t
where substring(convert(varchar,t.fieldA,21),5,20)
         >= substring(convert(varchar,t.fieldB,21),5,20)

答案 2 :(得分:2)

SELECT *
FROM SOME_TABLE
WHERE MONTH(fieldA) > MONTH(fieldB)
OR ( MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB) )

答案 3 :(得分:0)

我会从Julian日期的角度来看待这个,将每个字段转换为Julian日期(第一年之后的天数),然后比较这些值。

这可能会或可能不会产生闰年的预期结果。

如果您担心小时,分钟,秒等,可以调整DateDiff函数来计算自年初以来的小时数(或分钟或秒)。

SELECT *
FROM SOME_Table
WHERE DateDiff(d, '1/01/' + Cast(DatePart(yy, fieldA) AS VarChar(5)), fieldA) >=
      DateDiff(d, '1/01/' + Cast(DatePart(yy, fieldB) AS VarChar(5)), fieldB)

答案 4 :(得分:0)

用于测试的临时表

Create table #t (calDate date)
Declare @curDate date  = '2010-01-01'
while @curDate < '2021-01-01'
begin
   insert into #t values (@curDate)
   Set @curDate = dateadd(dd,1,@curDate)
end 

任何大于或等于今天的日期的示例

Declare @testDate date = getdate()
SELECT *
FROM #t
WHERE datediff(dd,dateadd(yy,1900 - year(@testDate),@testDate),dateadd(yy,1900 - year(calDate),calDate)) >= 0

比今天更少的任何一天的另一个例子

Declare @testDate date = getdate()
SELECT *
FROM #t
WHERE datediff(dd,dateadd(yy,1900 - year(@testDate),@testDate),dateadd(yy,1900 - year(calDate),calDate)) < 0