使用日期变量计算上次工作日期

时间:2016-07-28 14:02:53

标签: sql sql-server sql-server-2008

在sql表中,我有一个包含日期的列。我想计算每个日期的最后一个工作日。

有些日期是;

  • 2016-05-05
  • 2016年7月1日
  • 2016年3月5日

我想过使用与此相似的东西

 SELECT DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))

但不确定我需要改变什么。

3 个答案:

答案 0 :(得分:0)

declare @date datetime = '20160211'



SELECT dateadd(day,-day(dateadd(month,1,@DATE)), dateadd(month,1,@DATE) )  - 
        CASE WHEN 
            datediff(day,0,dateadd(day,
                                    -day(dateadd(month,1,@DATE)), 
                                    dateadd(month,1,@DATE))
                                                ) % 7 = 5 
            THEN 
                1 
                ELSE 
                0
            END -
        CASE WHEN 
            datediff(day,0,dateadd(day,
                                    -day(dateadd(month,1,@DATE)), 
                                    dateadd(month,1,@DATE))
                                    ) % 7 = 6 
            THEN 
                2 
                ELSE 
                0 
            END 

答案 1 :(得分:0)

如果你每天都在工作:

DECLARE @date datetime = GETDATE();

--Last day of month
SELECT DATEADD(MONTH, DATEDIFF(MONTH,0,@date)+1,0)-1

如果你像我一样,从星期一到星期五工作:

--Last day from MON-FRI
--1-SUN, 2-MON, ..., 7-SAT
SELECT TOP 1 DATEADD(MONTH, DATEDIFF(MONTH,0,@date)+1,0)-N
FROM (VALUES (1),(2),(3),(4),(5),(6),(7)) T(N)
WHERE DATEPART(WEEKDAY, DATEADD(MONTH, DATEDIFF(MONTH,0,@date)+1,0)-N) IN (2,3,4,5,6)--From MON to FRI
ORDER BY N;

您只需更改工作日即可。

如果您想要包含假期,则需要包含该日期的附加表格。

答案 2 :(得分:0)

这是我的SQL直接找到您当前月份的最后一个工作日。我在我的存储过程中有这个。

 declare @dt datetime, 
        @lastDate datetime, 
        @lastWeekDay datetime
set @dt=getdate();
<-- if you want to find of specific month than in place of getdate() above write like '06/06/2016' -->
set @lastDate = (SELECT DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, @dt) + 1,0)));
declare @dayOfWeek INT = (SELECT DATEDIFF(dd, 0, @lastDate) % 7);
set @lastWeekDay = (SELECT CASE WHEN @dayOfWeek = 5 THEN DATEADD(dd, -1, @lastDate)
                           WHEN @dayOfWeek = 6 THEN DATEADD(dd, -2, @lastDate)
                           ELSE @lastDate END)
SELECT @lastWeekDay;