Как я могу сравнить два поля даты и времени, но игнорировать год? - PullRequest
5 голосов
/ 22 октября 2008

Я собираюсь стереть с себя шляпу VBScript и написать классический ASP для запроса базы данных SQL Server 2000.

Вот сценарий:

  • У меня есть два поля datetime , которые называются fieldA и fieldB .
  • fieldB никогда не будет иметь значения года больше года fieldA
  • Возможно Возможно, что два поля будут иметь один и тот же год.

Мне нужны все записи, где fieldA > = fieldB , независимо от года . Просто представьте, что каждое поле - это месяц и день.

Как я могу получить это? Мои знания о функциях даты и времени T-SQL в лучшем случае незначительны.

Ответы [ 5 ]

14 голосов
/ 22 октября 2008

Вы можете использовать встроенные функции времени, такие как ДЕНЬ и МЕСЯЦ. например,

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

Выбор всех строк, в которых либо месяц поля А больше, либо месяцы одинаковы, а день поля А больше.

3 голосов
/ 22 октября 2008
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 голосов
/ 22 октября 2008
SELECT *
FROM SOME_TABLE
WHERE MONTH(fieldA) > MONTH(fieldB)
OR ( MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB) )
0 голосов
/ 28 апреля 2014

Temp таблица для тестирования

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
0 голосов
/ 22 октября 2008

Я хотел бы подойти к этому с точки зрения юлианской даты, преобразовать каждое поле в юлианскую дату (число дней после первого года), а затем сравнить эти значения.

Это может дать или не дать желаемых результатов в отношении високосных лет.

Если вас беспокоили часы, минуты, секунды и т. Д., Вы можете настроить функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...