Вычитание одного года

ВЫБРАТЬ

@begindate = dateadd(mm,-1,CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/15/' +                  CAST(datepart(YYYY,getdate() -1) AS varchar(4))),

@enddate = CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/14/' + CAST(datepart(YYYY,getdate() -1) AS varchar(4))

Сейчас этот код возвращает даты с 15 мая по 14 июня. Это обязательные даты, которые мне нужны, но мне также нужно, чтобы они были в 2013 году, и это возвращает 2014 год. Я пытался сделать dateadd(yyyy, -1), и это не сработало . Поэтому мне было интересно, знает ли кто-нибудь, как я смогу получить дату прошлого года.


person user3630473    schedule 25.06.2014    source источник
comment
Почему dateadd(yyyy, -1, xxx) не сработало?   -  person Gordon Linoff    schedule 25.06.2014
comment
Что ты пытаешься сделать? Все это разбиение, приведение и объединение (в формате США, определенно нестандартное) скрывает то, что вы спрашиваете.   -  person Panagiotis Kanavos    schedule 25.06.2014
comment
Получить данные с 15-го числа предыдущего месяца по 14-е число текущего месяца на основе прошлого года   -  person user3630473    schedule 25.06.2014
comment
Ваш текущий код возвращает две строки, которые нельзя использовать для сравнения дат, если параметры сортировки сервера/базы данных/столбца не являются правильными. Если вы использовали две переменные в операторе WHERE и не получили результатов, вероятно, причина в этом.   -  person Panagiotis Kanavos    schedule 25.06.2014


Ответы (3)


Если DateAdd не работает, в вашей реализации должна быть ошибка. Попробуйте так после существующего кода:

SET @begindate = dateadd(year, -1, @begindate);
SET @enddate = dateadd(year, -1, @enddate)
person Tab Alleman    schedule 25.06.2014
comment
@begindate и @enddate являются строками. Выполнение любой арифметики дат преобразует их в даты с использованием формата сервера (скорее всего, не в формате США для всех за пределами США) с неожиданными результатами. - person Panagiotis Kanavos; 25.06.2014
comment
Я предположил, что переменные - это дата и время. Пользователь не указывает, и хотя его код создает строку, это строка, которую можно неявно преобразовать в дату и использовать для заполнения переменной даты и времени. Есть много разных способов добиться желаемых результатов, но я сосредоточился на попытке использовать dateadd(), которая не сработала. - person Tab Alleman; 25.06.2014
comment
Используемый формат не будет работать в локалях, отличных от США, поэтому вы не можете предположить, что неявное преобразование возможно. - person Panagiotis Kanavos; 25.06.2014

объявить @begindate datetime объявить @enddate datetime

set @begindate = dateadd(mm,-1,CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/15/' + CAST(datepart(YYYY, getdate()) - 1 AS varchar(4 )))

set @enddate = CAST(datepart(mm,getdate()) AS VARCHAR(2)) + '/14/' + CAST(datepart(YYYY, getdate()) - 1 AS varchar(4))

выберите @begindate объединение всех выберите @enddate

person Rich    schedule 25.06.2014
comment
Я тоже так думал, но там написано неправильный синтаксис возле AS и я не знаю что с ним не так - person user3630473; 25.06.2014
comment
У меня отлично работает на SQLServer. Что вы используете? - person Rich; 25.06.2014

Вместо работы со строками вы можете использовать переменные даты и арифметику даты:

declare @lastyear date=dateadd(yy,-1,cast(getdate() as date))
declare @currentMonth date=dateadd(d,-day(@lastyear),@lastyear)
declare @prevMonth date=dateadd(m,-1,@currentMonth)

select @lastyear,DATEADD(d,14,@currentMonth),DATEADD(d,15,@prevMonth)

В SQL Server 2012 это еще проще, поскольку вы можете использовать функцию DATEFROMPARTS для построить новую дату из его частей.

person Panagiotis Kanavos    schedule 25.06.2014