2015-01-22 6 views
0

В настоящее время я работаю над запросом, который возвращает записи из диапазона дат. Идеальным для начала является все, начиная с 2015 года. Теоретически, не следует ли каждому из трех операторов SET задавать переменную до 2015 *?SQL YEAR (GETDATE())

DECLARE @startDate datetime; 
SET @startDate = '20150101'; 
SET @startDate = YEAR(GETDATE()); 
SET @startDate = DATEPART(yyyy,GETDATE()); 

Только первая, жестко закодированная дата, ведет себя так, как ожидалось. Остальные два возвращают ВСЕ записи, которые запрашиваются. Я что-то упустил?

* РЕДАКТИРОВАТЬ: Извиняюсь за то, насколько непонятно, что я был с этим изначально. В принципе, @startDate должен быть установлен в 01-01-XXXX, где XXXX - это то, к чему относится сегодняшняя дата года. Он сравнивается с другой переменной DATETIME. Надеюсь, что это прояснит ситуацию.

+0

Как эти значения используются в 'where' положение, вы можете добавить запрос. Второй третий '@ startDate' будет иметь эту дату '1905-07-09 00: 00: 00.000' –

+0

У вас должен быть индекс в столбце даты таблицы, а затем использовать дату, чтобы он мог использовать этот индекс. Итак, WHERE myDate> = '1/1/2015' – JBrooks

+0

'WHERE ([Date Requested])> = (@startDate)' – Eiketsu

ответ

2

Ответ на ваш вопрос «Нет». Переменная @StartDate - это дата времени. Это не имеет смысла:

set @startDate = 2015 

Это не имеет смысла. Целое число, которое выглядит как год, не является датой.

Если вы хотите, первый день года, вы можете сделать:

set @startDate = dateadd(day, 
         1 - datepart(dayofyear, getdate()), 
         cast(getdate() as date) 
         ) as FirstDayOfYear 
+0

Это похоже на сделали трюк. Огромное спасибо. Я ценю помощь. – Eiketsu

2

Я думаю, что это будет работать (для SQL-сервера):

SET @startDate = cast(YEAR(GETDATE()) as varchar(4)) 
SET @startDate = cast(DATEPART(yyyy,GETDATE()) as varchar(4)) 

Это покажет вам, что происходит:

DECLARE @startDate datetime 
SET @startDate = '20150101' 
select @startdate 
SET @startDate = YEAR(GETDATE()) 
select @startdate 
SET @startDate = cast(YEAR(GETDATE()) as varchar(4)) 
select @startdate 
SET @startDate = DATEPART(yyyy,GETDATE()) 
select @startdate 
SET @startDate = cast(DATEPART(yyyy,GETDATE()) as varchar(4)) 
select @startdate 
0

YEAR(GETDATE()) и DATEPART(yyyy,GETDATE()); вернется только год часть из да, поэтому, если вы запустили их сегодня, вы получите 2015, а не 2015-01-01 как вам кажется.

Если вы хотите, чтобы значение даты в начале текущего года, один из способов будет:

SET @startDate = YEAR(GETDATE()) + '-01-01'; 
+0

'Конверсия не удалась при преобразовании даты и/или времени из символьной строки.' – Eiketsu

+0

Это должно быть 'SET @startDate = STR (YEAR (GETDATE()), 4) + '-01-01';' –

Смежные вопросы