Я стряхиваю пыль с VBScript и пишу классический ASP для запросов к базе данных SQL Server 2000.
Вот сценарий:
Мне нужны все записи, где fieldA> = полеB, независимо от года. Просто представьте, что каждое поле - это всего лишь месяц и день.
Как я могу это получить? Мои знания о функциях даты / времени T-SQL в лучшем случае нечеткие.





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)
Вы можете использовать встроенные функции времени, такие как ДЕНЬ и МЕСЯЦ. например
SELECT * from table where
MONTH(fieldA) > MONTH(fieldB) OR(
MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB))
Выбор всех строк, в которых месяц для fieldA больше или месяцы совпадают, а число для fieldA больше.
В других ответах есть кое-что хорошее, но это лучше всего соответствует моим потребностям.
SELECT *
FROM SOME_TABLE
WHERE MONTH(fieldA) > MONTH(fieldB)
OR ( MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB) )
Я бы подошел к этому с точки зрения юлианской даты, преобразовал каждое поле в юлианскую дату (количество дней после первого года), а затем сравнил эти значения.
Это может дать или не дать желаемых результатов в отношении високосных лет.
Если вас беспокоят часы, минуты, секунды и т. д., Вы можете настроить функции 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)
Таблица температур для тестирования
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
Я забыл о стенографии. Это, наверное, лучше.