SQL вычесть ровно год

Сначала я хочу поблагодарить всех за помощь, это дало мне много идей о том, как я должен это сделать, и я придумал свой собственный метод, мне просто нужна помощь, чтобы поместить его в запрос

Я хочу, чтобы пользователь ввел дату, а затем получил текущий год. вычтите два и затем сделайте дату и добавьте, что все отправляли. Возможно ли это и как лучше это сделать?

year(getdate())-@DYYYY=Y 

   

 dateadd(year,-Y,getdate())

5 ответов

Решение

На основании вашего комментария относительно жестко закодированных значений года, использование

 DATEDIFF(year,BOOKED,GETDATE())

надеюсь, что количество лет, прошедших с даты, после которой вы будете следовать, должно привести вас в нужном направлении.

Вы, вероятно, в конечном итоге что-то вроде:

SELECT DATEADD(year, -DATEDIFF(year,BOOKED,GETDATE()), GETDATE())

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

Поможет ли результат следующих действий достичь этого?

SELECT SDESCR,DATEADD(YEAR, DATEDIFF(YEAR, 0, BOOKED),0), Sum(APRICE) as Total, Sum(PARTY) as PAX
FROM  DataWarehouse.dbo.B01Bookings AS B101Bookings
GROUP BY SDESCR,DATEADD(YEAR, DATEDIFF(YEAR, 0, BOOKED),0)

Как я уже сказал, это предположение относительно вашей цели, а не обязательно ответ на ваш вопрос.

Использовать этот:

dateadd(year, -1, getdate())

Чтобы вычесть год из даты, просто используйте функцию DATEADD()

SELECT DATEADD(year, -1, GETDATE())

Отредактировано:

SELECT SDESCR,DYYYY, Sum(APRICE) as Total, Sum(PARTY) as PAX
FROM  DataWarehouse.dbo.B01Bookings AS B101Bookings
WHERE 
(BOOKED <= Convert(int, Convert(datetime, Convert(varchar, DatePart(month, GETDATE())) + '/' + Convert(varchar, DatePart(day, GetDate())) + '/' + DYYYY))
Group By SDESCR,DYYYY
Order by DYYYY

Отредактировано 2:

Я только что запустил это заявление

select  Convert(datetime, Convert(varchar, DatePart(month, GETDATE())) + '/' + Convert(varchar, DatePart(day, GetDate())) + '/' + '2007')

Который работает нормально. так что мой вопрос, что хранится в столбце DYYYY? Всегда ли он содержит действительный год, может ли он содержать нули?

Хорошо... Из вашего ответа Джо Стефанелли я думаю, что часть того, что вы действительно пытаетесь сделать, - это избегать переписывания запроса каждый год. Если это так, то вы можете создать таблицу чисел. Простой и быстрый пример будет таким...

 SELECT TOP 3000
        IDENTITY(INT,1,1) as N
   INTO #Numbers
   FROM Master.dbo.SysColumns sc1,
        Master.dbo.SysColumns sc2

Мгновенный стол с целыми числами от 1 до 3000.

Это позволяет вам присоединиться или отобрать таблицу #Numbers для вашего запроса. Если вы хотите создать более ограниченный диапазон, то вы можете создать таблицу с нужными вам годами (или табличную функцию, которая будет динамически создавать одну и ту же таблицу).

Вы также можете пойти дальше и реализовать табличную функцию, которая будет возвращать результат в два столбца.

year offset
2010 0    --Produced from DATEPART(y,GETDATE())
2009 -1    --loop/set subtract 1
2008 -2    --repeat until you have enough...

Таким образом, предложение where может читать что-то вроде

SELECT *
FROM yourTable, yourFunction
WHERE ((DYYYY = CAST(yourFunction.year as VARCHAR) AND (BOOKED <= DATEADD(yy, yourFunction.offset, GETDATE()))

Обратите внимание, что хотя телевизионные функции должны ежегодно экономить на программировании, вы можете столкнуться с незначительными потерями производительности.

The simplest way to get the date 1 year ago is:

SELECT GETDATE() - 365
select DATEADD(yy, -1, getdate())
Другие вопросы по тегам