Сравните текущую дату с сохраненной датой и временем, используя месяц только год - PullRequest
6 голосов
/ 13 февраля 2009

При использовании SQL Server 2005 у меня есть поле, содержащее значение datetime.

Я пытаюсь создать 2 запроса:

  1. Сравните, чтобы увидеть, соответствует ли сохраненное время-дата тому же месяцу и году, что и текущая дата
  2. Сравните, чтобы увидеть, совпадает ли сохраненное время и дата с текущей датой

Возможно, есть простое решение, но я продолжаю бить кирпичные стены, используя различные образцы, которые я могу найти, какие-либо мысли?

Заранее спасибо.

Ответы [ 6 ]

7 голосов
/ 13 февраля 2009

Сравните части даты:

WHERE YEAR( columnName ) = YEAR( getDate() )
5 голосов
/ 17 февраля 2009

Хотя другие ответы будут работать, все они страдают от одной и той же проблемы: они применяют преобразование к столбцу и поэтому никогда не будут использовать индекс для этого столбца.

Для поиска даты без преобразования вам понадобится пара встроенных функций и немного математики. Пример ниже:

--create a table to hold our example values
create table #DateSearch
(
    TheDate datetime not null
)


insert into #DateSearch (TheDate)
--today
select getdate()
union all
--a month in advance
select dateadd(month, 1, getdate())
union all
--a year in advance
select dateadd(year, 1, getdate())
go

--declare variables to make things a little easier to see
declare @StartDate datetime, @EndDate datetime

--search for "same month+year as current date"
select @StartDate = dateadd(month, datediff(month, 0, getdate()), 0), @EndDate = dateadd(month, datediff(month, 0, getdate()) + 1, 0)

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate

--search for "same year as current date"
select @StartDate = dateadd(year, datediff(year, 0, getdate()), 0), @EndDate = dateadd(year, datediff(year, 0, getdate()) + 1, 0)

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate

Что делает оператор, чтобы избежать преобразований, так это найти все значения, которые больше или равны началу текущего периода времени (месяц или год) И все значения меньше начала следующего (недействительного) времени период. Это решает нашу проблему с индексами, а также уменьшает любые проблемы, связанные с округлением 3 мс в типе DATETIME.

2 голосов
/ 14 февраля 2009

Мне кажется, что DATEDIFF - это именно то, что вам нужно:

-- #1 same month and year
SELECT *
FROM your_table
WHERE DATEDIFF(month, your_column, GETDATE()) = 0

-- #2 same year
SELECT *
FROM your_table
WHERE DATEDIFF(year, your_column, GETDATE()) = 0
2 голосов
/ 13 февраля 2009
SELECT * FROM atable 
WHERE 
    YEAR( adate ) = YEAR( GETDATE() )
AND
    MONTH( adate ) = MONTH( GETDATE() )
0 голосов
/ 13 февраля 2009

Вы можете использовать что-то вроде этого

а)

select *
from table
where MONTH(field) = MONTH(GetDATE()) 
  and YEAR(field) = YEAR(GetDATE())

б)

select *
from table
where YEAR(field) = YEAR(GetDATE())
0 голосов
/ 13 февраля 2009

Функция datepart позволяет вам получить нужные биты:

declare @d1 as datetime
declare @d2 as datetime

if datepart(yy, @d1) = datepart(yy, @d2) and datepart(mm, @d1) = datepart(mm, @d2) begin
    print 'same'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...