SQL语句如何统计a时间和b时间有多少个工作日?
发布网友
发布时间:2022-05-03 16:50
我来回答
共4个回答
懂视网
时间:2022-05-03 21:11
/*
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
末一个星期的工作日数:DATEPART(dw, @enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数 - 第一个星期的天数 - 末一个星期的天数) / 7 * 5
+ 第一个星期的工作日数
+ 末一个星期的工作日数
*/
--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算
--必须先SET DATEFIRST 1
CREATE FUNCTION dbo.CalcWorkHours(@bdate DATETIME, @edate DATETIME)
RETURNS INTEGER
AS BEGIN
DECLARE @hours INTEGER
IF @@DATEFIRST <> 1 OR @bdate > @edate
RETURN -1
SELECT @hours =
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE WHEN DATEPART(wk, @edate-1)-DATEPART(wk,@bdate) = 0 THEN
CASE WHEN DATEPART(dw, @bdate) > 5 THEN 0
WHEN DATEPART(dw, @edate-1) > 5 THEN 6 - DATEPART(dw, @bdate)
ELSE DATEPART(dw, @edate-1) - DATEPART(dw, @bdate) + 1 END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数 * 5
ELSE (DATEDIFF(dd,@bdate,@edate)
- (8-DATEPART(dw, @bdate))
- DATEPART(dw, @edate-1)) / 7 * 5
--再加上第一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @bdate) < 6 THEN 6 - DATEPART(dw, @bdate)
ELSE 0 END
--加上末一个星期里的工作日数
+ CASE WHEN DATEPART(dw, @edate-1)>5 THEN 5 ELSE DATEPART(dw, @edate-1) END
END * 8
RETURN @hours
END
热心网友
时间:2022-05-03 18:19
首先保证,a 与 b 表的时间是 date 或者 datetime 类型:
1、Oracle 写法:
select sum (case when to_char(a.time,'d')-1>=1 and to_char(a.time,'d')-1<=5 then 1
else 0
end)
from tablename a;
2.MSSQL 和 Sybase 写法:
select sum(case when datepart(weekday,a.datetime)-1 >=1 and datepart(weekday,a.datetime)-1<=5 then 1
else 0
end)
from tablename a
热心网友
时间:2022-05-03 19:37
declare @a datetime
declare @b datetime
declare @c int
set @a = '2012-07-01'
set @b = GETDATE()
if(DATEPART(WEEKDAY, @a)=1 or DATEPART(WEEKDAY, @a)=7)
set @c = DATEDIFF(DAY, @a, @b)/7 * 5
else
set @c = (DATEDIFF(DAY, @a, @b)/7 * 5) + DATEDIFF(DAY, @a, @b) % 7 - 2
select @c
这样就OK
热心网友
时间:2022-05-03 21:12
declare @a datetime
declare @b datetime
declare @c int
set @a = '2012-07-01'
set @b = GETDATE()
if(DATEPART(WEEKDAY, @a)=1 or DATEPART(WEEKDAY, @a)=7)
set @c = DATEDIFF(DAY, @a, @b)/7 * 5
else
set @c = (DATEDIFF(DAY, @a, @b)/7 * 5) + DATEDIFF(DAY, @a, @b) % 7 - 2
。
用SQL语言计算两个日期间有多少个工作日
第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天 末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”否则按下面的公式计算 (两个日期间的总天数 - 第一个星期的天数 - 末一个...
sql语句如何查询指定日期共几天
end_date Datetime, --要查询的结束日期 bz bit --@bz=0 查询工作日,@bz=1 查询休息日,@bz IS NULL 查询全部日期 )RETURNS @re TABLE(id int identity(1,1),Date datetime,Weekday nvarchar(3))AS BEGIN DECLARE @tb TABLE(ID int IDENTITY(0,1),a bit)INSERT INTO @tb(a) SE...
在sql中怎样计算两个时间之间的天数?求高人指点
DateDiff(d,Date,GetDate())其中 d 为 "天" (计算天的差数 若为"h"则是小时,以次类推)Date 为在数据库里查询出来的时间 GetDate()为获取的当前时间(可以换成任何获取时间),
用sql语句怎么求 一个表T中 字段A,和字段B数据都相同的 数据。_百度知 ...
where t1.a=t2.a and t1.b=t2.b;
sql中如何计算得到一段时间内指定日期中有多少个休息日和节假日
SQL中提供了一些日期计算函数如dateadd,可对日期进行递增操作。基本代码如下:declare @startdate datetime='2015-9-10'declare @enddate datetime='2015-10-10'declare @days int=0 set @startdate=dateadd(day,@startdate,1) --给开始日期加1天 while(@startdate<@enddate) --如果小于结束日期,...
SQL 统计每日上班打卡和下班打卡语句
select A1.card_no,A1.atte_time as "上班时间",A2.atte_time as "上班时间1",A3.atte_time as "上班时间2",A4.atte_time as "上班时间3",B1.atte_time as "下班时间",B2.atte_time as "下班时间1",B3.atte_time as "下班时间2",B4.atte_time as "下班时间3"from (select ...
如何在sql中统计一天内一个用户既有a操作又有b操作的数量
b在同一列,无法直接进行比较判断,需要创造新的一列,表示用户的下一步操作类型。2、其次使用开窗函数中的前后函数,返回用户的下一步操作类型,判断用户下一步操作的类型。3、然后将上一步操作的结果作为子查询表,筛选在a操作之后进行b操作的用户。4、最后对第二步结果按天分组,统计计数。
SQl语句写某一段时间范围内的数量
when to_char(p.tm,'dd') < 11 then '上旬' when to_char(tm,'dd') < 21 then '中旬' else '下旬' end as day from ST_PPTN_R p,ST_STBPRP_B b where p.STCD=b.STCD AND b.STTP like'%PP%')group by stcd, stnm, month, day;
sql时间统计问题,跨日数据统计
您好,以下是mysql语法:SELECTCOUNT(1)FROMdb_tableWHEREDATEDIFF(update_time, create_time) > 0;
SQLServer的分时间段统计的SQL语句。
没看懂a和b二个表的用途,假设对表a统计。直接统计比较困难,不过你可以先把日期转换成到最早日期的分钟数,把分钟数除以10求整,得到的新值就是每10分钟一组的了。不过新值需要保存到临时表,再对临时表分组统计。--按上述分析将a表中的f_time转换为以最早日期为起点的每10分钟一个值的新列,如...