2009-03-25 5 views
0

Это связано с Floor a date in SQL server, но я беру это один шаг дальше:Каков наилучший способ выполнить математику на пол в SQL Server?

Я пишу запрос на таблицу SQL Server, и я хочу, чтобы получить все записи за текущий календарный год и за предыдущий календарный год , Итак, прямо сейчас, я хочу, чтобы запрос возвращал все записи с 1 января 2008 года по сегодняшний день. Но прийти 1 января 2010 года, я хочу, чтобы возвращать записи не старше 2009 года

По существу, я хочу, чтобы пол текущая дата начала года, а затем вычесть 1.

После рыться некоторые Документация SQL Server, я придумал следующее:

WHERE create_date >= CAST((CAST(YEAR(GETDATE()) AS int) -1) AS varchar) 

, но это кажется уродливым. Есть ли способ лучше?

ответ

4

Почему бы просто не использовать функцию year для create_date?

WHERE YEAR(create_date) >= (YEAR(GETDATE()) -1) 

Это предполагает (как вы это делали), что нет никаких записей в базе данных больше, чем сегодняшняя дата

0

Я бы предложил назначить переменную с датой Lastyear-01-01, либо сделав UDF для него, или что-то вроде

DECLARE @startOfLastYear DATETIME 
SET @startOfLastYear = CAST(YEAR(GETDATE()) - 1 AS VARCHAR) + '-01-01' 

Затем сделайте запрос:

WHERE create_date >= @startOfLastYear 

по двум причинам:

  1. Используя YEAR() или любая другая функция на данных из таблиц (т.е. ГОД (create_date)) делает индексы непригодным для использования и уменьшает производительность запроса
  2. Имя переменной говорит точно, что это такое, а чтение кода проще.