我搞掉了我的VBScript帽子并写了一些经典的ASP来查询SQL Server 2000数据库。
以下是该方案:
我想要的是 fieldA > = fieldB ,独立于年份的所有记录。假装每个领域只有一个月和一个月。一天。
我怎么能得到这个?我对T-SQL日期/时间函数的了解充其量只是参差不齐。
答案 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