Как я могу сравнить два поля datetime, но игнорировать год?

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
9 798
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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 больше.

Я забыл о стенографии. Это, наверное, лучше.

tvanfosson 22.10.2008 00:51

В других ответах есть кое-что хорошее, но это лучше всего соответствует моим потребностям.

Mark Biek 22.10.2008 01:02
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

Другие вопросы по теме