How can I extract the last day of the month from dates like
DEC2009, APR2013, AUG2008, NOV2017, JUL2014 etc.
I've tried datepart, convert, cast, month, year and I keep getting in a mess with type conversion errors.
CodePudding user response:
Use try_convert
and eomonth()
declare @date varchar(7)='jul2014'
select Day(EOMonth(Try_Convert(date, @date)))
CodePudding user response:
You may try the following:
SELECT
dt,
DATEADD(day, -1, DATEADD(month, 1,
CONVERT(datetime, '01' dt, 106))) AS dt_eom
FROM yourTable;
Demo
The strategy here is to first build from e.g. DEC2009
the string 01DEC2009
. Then, we use CONVERT
with mask 106. We obtain the final day of the month by adding one month and then subtracting one day.
CodePudding user response:
You can use this
DECLARE @date VARCHAR(20)='DEC2009'
SELECT Day(CONVERT(NVARCHAR,CAST(DATEADD(MM,DATEDIFF(MM, -1, @date),-1) AS
DATE),100))
And
SELECT
date,
Day(CONVERT(NVARCHAR,CAST(DATEADD(MM,DATEDIFF(MM, -1, date),-1) AS
DATE),100)) AS date_eom
FROM Table;
CodePudding user response:
You can use the EOMONTH
function to get the last day in a month.
First construct an actual date value: add 01
to the beginning, then convert using style 106
. If you just use CONVERT
or CAST
without a style parameter, you may run into issues due to local culture. Instead you should specify the style explicitly.
SELECT
dt,
EOMONTH( CONVERT(date, '01' dt, 106) ) AS dt_eom
FROM yourTable;
CodePudding user response:
Thanks all (except for Larnu who didn't seem to understand or answer the question)
Your helpful advice and specifically the "TRY_CONVERT" allowed me to work that the two entries where the months were 4 characters fields that were throwing it. My final code was:
EOMONTH(CONVERT(DATE, LEFT(TRIM(myField),3) RIGHT(TRIM(myField),4)))
and it worked fine. :)
Happy days!