November 29, 2016 at 4:15 am
Hi All,
I need last business day from a table with ID,date and day column in it.
For e.g.
IDDate Day
11-Jan-2016 Friday
22-Jan-2016 Saturday
33-Jan-2016 Sunday
.
.
29 29-Jan-2016 Friday
30 30-Jan-2016 Saturday
31 31-Jan-2016 Sunday
32 1-Feb-2016 Monday
33 2-Feb-2016 Tuesday
.
.
60 29-Feb-2016 Monday
and so on....
so I need
29-Jan-2016 Friday(Excluding Saturday and Sunday)
29-Feb-2016 Monday
.
.
.
Thanks
November 29, 2016 at 5:38 am
A Calendar Table is really handy for this.
As an Inline calculation
the way i would tackle it is with DateMath, and a case statement that checks for Saturday or Sunday
here i created 64 months if dates, and used a calculation to confirm i was getting the last biz day of the month:
does this look right?
/*
TheDate LastDayOfMonth DatePartOfLastDay DateNameOfLastDay LastBizDay LastBizDayOfWeek
2016-01-15 00:00:00.000 2016-01-31 1 Sunday 2016-01-29 Friday
2016-02-15 00:00:00.000 2016-02-29 2 Monday 2016-02-29 Monday
2016-03-15 00:00:00.000 2016-03-31 5 Thursday 2016-03-31 Thursday
*/
WITH ExampleMonths
AS
(
SELECT DATEADD(mm,MiniTally.N,'2015-01-15') AS TheDate
FROM (select row_number() over (order by num) -1 as N
from (values (1)) t (num)
group by cube (num, num, num, num, num, num) --2^6 = 64 ,more num = another order power of 2)
) MiniTally
)
select TheDate,
DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)) AS ABitLessThanFirstOfMonth,
CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))) AS LastDayOfMonth,
DATEPART(weekday,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) AS DatePartOfLastDay,
DATENAME(dw,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) AS DateNameOfLastDay,
CASE
WHEN DATEPART(weekday,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) IN (7) --Saturday
THEN DATEADD(dd,-1,
CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
)
WHEN DATEPART(weekday,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) IN(1) --Sunday
THEN DATEADD(dd,-2,
CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
)
ELSE CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
END AS LastBizDay,
DATENAME(dw,CASE
WHEN DATEPART(weekday,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) IN (7) --Saturday
THEN DATEADD(dd,-1,
CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
)
WHEN DATEPART(weekday,(CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0))))) IN(1) --Sunday
THEN DATEADD(dd,-2,
CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
)
ELSE CONVERT(DATE,dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,TheDate ) + 1, 0)))
END) AS LastBizDayOfWeek
FROM ExampleMonths
Lowell
November 29, 2016 at 5:57 am
Isn't it as simple as this?
SELECT DISTINCT
MAX(TheDate) OVER(PARTITION BY YEAR(MyDate), MONTH(MyDate)) AS LastBizofMonth
,MyDay
FROM MyTable
WHERE MyDay NOT IN ('Saturday', 'Sunday')
By the way, please don't double-post.
John
November 29, 2016 at 6:23 am
John Mitchell-245523 (11/29/2016)
Isn't it as simple as this?
SELECT DISTINCT
MAX(TheDate) OVER(PARTITION BY YEAR(MyDate), MONTH(MyDate)) AS LastBizofMonth
,MyDay
FROM MyTable
WHERE MyDay NOT IN ('Saturday', 'Sunday')
By the way, please don't double-post.
John
Depends on the OP's definition of a Working Day. For example, I need to omit Public Holiday's as well as weekends. This also includes Observed holidays, such as Christmas Day this year, due to it falling on a Sunday (it is therefore observed on the Tuesday, as that is the next non public holiday weekday).
Thom~
Excuse my typos and sometimes awful grammar. My fingers work faster than my brain does.
Larnu.uk
November 29, 2016 at 8:20 am
Thanks John
November 29, 2016 at 9:41 am
Using this sample data:
CREATE TABLE #myTable (dt date UNIQUE NOT NULL);
WITH E AS (SELECT v FROM (VALUES (1),(1),(1),(1),(1),(1)) t(v))
INSERT #myTable
SELECT CAST(DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY (SELECT 1))-1, '20140101') AS date)
FROM E a, E b, E c, E d;
You could do this:
SELECT [date] = MAX(dt),
[day] = DATENAME(WEEKDAY,MAX(dt))
FROM #myTable
WHERE DATENAME(WEEKDAY,dt) NOT IN ('Saturday', 'Sunday')
GROUP BY DATEPART(YEAR,dt), DATEPART(MONTH,dt)
ORDER BY MAX(dt); -- not required, including for readability
-- Itzik Ben-Gan 2001
Viewing 6 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy