Get the previous month number including year

Get the previous month number including year



I have a table in which I get the coupons of a specific company.
My coupon table is like:



Company_Coupon



I keep my months in the format of their number (1-12).



When I update the total coupons for the invoicing, I want to update the ones from the previous month.



I do this by the following query:


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



My query works but I noticed that this won't work in January 2019.



How can I update this query so that it will work in January 2019?






It would probably be better to store a single YearMonth column, typed as date with a constraint enforcing that it's always the first day of the month. That way you can use straightforward date math functions to compute this. E.g. DATEADD(month,DATEDIFF(month,'20010201',GETDATE()),'20010101') always gives you the first of last month.

– Damien_The_Unbeliever
Sep 6 '18 at 7:48



YearMonth


date


DATEADD(month,DATEDIFF(month,'20010201',GETDATE()),'20010101')






@Damien_The_Unbeliever Sadly this isn't an option at the moment since I use this table to loop through the rows and manipulate them using different algorithms

– user3127554
Sep 6 '18 at 7:52




4 Answers
4



Try with case when like below:


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)






Sadly, this doesn't return the ones from december 2018 when I set GETDATE() to 2019-01-01

– user3127554
Sep 6 '18 at 7:50


GETDATE()






modified the answer..check now

– fa06
Sep 6 '18 at 7:53






Looks great! @fa06 thank you very much

– user3127554
Sep 6 '18 at 7:56






if it helped u, please mark it as answer

– fa06
Sep 6 '18 at 7:56



You can try to get different number between 1900-01-01 and your data, then do some calculation to get last month.


1900-01-01



Query 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)



Results:


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



so you query can be


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))



As I said in a comment, I'd prefer to have a single YearMonth column with the correct data type for datetime work, but we can do something very similar here:


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)



The two dates used in the above expression do not matter much. All that matters really is the relationship between them. Here, the second date falls a month before the first and it's the relationship that effectively gets applied to GETDATE() by the DATEADD/DATEDIFF expression. It's a pattern that can be used in lots of different ways - e.g. a variant of this pattern can be used to find the last day of 3 months ago if you're not on a SQL version that supports EOMONTH.


GETDATE()


DATEADD


DATEDIFF


EOMONTH



If you use SQL Server 2012 or later version, you can employ the eomonth() function that returns last day of a previous month for a given date. From it, you can extract both month() and year() parts and use them in your query:


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()));



Thanks for contributing an answer to Stack Overflow!



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)