Получить номер предыдущего месяца, включая год - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть таблица, в которой я получаю купоны определенной компании.Моя таблица купонов выглядит следующим образом:

Company_Coupon

  • ID
  • CompanyID
  • Месяц
  • Total_Coupons
  • Год

Я держу свои месяцы в формате их числа (1-12).

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

Я делаю это по следующему запросу:

UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE CompanyID = 1205
AND Month = MONTH(GETDATE())-1 AND Year  = YEAR (GETDATE()) 

Мой запрос работает, но я заметил, что он не будет работать в январе 2019 года.

Как я могу обновить этозапрос, чтобы он работал в январе 2019 года?

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Если вы используете SQL Server 2012 или более позднюю версию, вы можете использовать функцию eomonth(), которая возвращает последний день предыдущего месяца для данной даты. Из него вы можете извлечь детали month() и year() и использовать их в своем запросе:

UPDATE c SET Total_Coupons = @count
from dbo.Company_Coupon c
WHERE c.CompanyID = 1205
    AND c.Month = MONTH(eomonth(GETDATE()))
    AND c.Year  = YEAR(eomonth(GETDATE()));
0 голосов
/ 06 сентября 2018

Вы можете попытаться получить другое число между 1900-01-01 и вашими данными, а затем выполнить некоторые вычисления, чтобы получить в прошлом месяце.

Запрос 1 :

SELECT DATEADD(month, DATEDIFF(month,0,'2019-01-01') - 1, 0)
UNION ALL
SELECT DATEADD(month, DATEDIFF(month,0,'2018-08-01') - 1, 0)

Результаты :

|                      |
|----------------------|
| 2018-12-01T00:00:00Z |
| 2018-07-01T00:00:00Z |

так что ваш запрос может быть

UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE 
    CompanyID = 1205
AND 
    Month = MONTH(DATEADD(month, DATEDIFF(month,0,GETDATE()) - 1, 0))
AND 
    Year  = YEAR (DATEADD(month, DATEDIFF(month,0,GETDATE()) - 1, 0)) 
0 голосов
/ 06 сентября 2018

Как я уже сказал в комментарии, я бы предпочел иметь один столбец YearMonth с правильным типом данных для работы с датой и временем, но мы можем сделать что-то очень похожее здесь:

UPDATE Company_Coupon
SET Total_Coupons = @count
FROM Company_Coupon
CROSS APPLY (SELECT 
  DATEADD(month,DATEDIFF(month,'20010201',GETDATE()),'20010101')) t(LastMonth)
WHERE CompanyID = 1205
AND Month = MONTH(LastMonth) AND Year  = YEAR(LastMonth) 

Две даты, использованные в вышеприведенном выражении, не имеют большого значения. Все, что действительно важно, это отношения между ними. Здесь вторая дата выпадает за месяц до первой, и это отношение эффективно применяется к GETDATE() выражением DATEADD / DATEDIFF. Это шаблон, который можно использовать по-разному - например, вариант этого шаблона можно использовать, чтобы найти последний день 3 месяца назад, если вы не используете версию SQL, которая поддерживает EOMONTH.

0 голосов
/ 06 сентября 2018

Попробуйте использовать случай, как показано ниже:

UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE CompanyID = 1205
AND Month = (case when MONTH(GETDATE())-1=0 then 12 else MONTH(GETDATE())-1 end)  AND Year  = (case when MONTH(GETDATE())-1=0 then YEAR (GETDATE())-1 else YEAR (GETDATE()) end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...