工时统计的sql练习--包含时间处理

//按月统计,除去周末的考勤,(工时,请假,缺勤)

--建表sql 创建[dbo].[AbsenceHourld]
CREATE TABLE [dbo].[AbsenceHourld](
[id] [int] NULL,
[date] [datetime] NULL,
[name] [varchar](50) NULL,
[hours] [int] NULL
) ON [PRIMARY]
--创建[dbo].[ManHour]
CREATE TABLE [dbo].[ManHour](
[id] [int] NULL,
[date] [datetime] NULL,
[name] [varchar](50) NULL,
[hours] [int] NULL
) ON [PRIMARY]
--建表sql
--统计所有员工-- 按天统计考勤数据
select a.name as 姓名,
CONVERT(varchar(100), a.[date] ,111) as 时间天,
sum(a.[hours])as 工作时间,
sum(isnull(b.[hours],0)) as 请假时间 ,
8-sum(a.[hours])+sum(isnull(b.[hours],0)) as 缺勤时间
from ManHour a
left join AbsenceHourld b
on a.name=b.name
where datepart(weekday, a.[date]) not in (6,7)
group by CONVERT(varchar(100), a.[date] ,111) ,a.name

-- 创建返回某月去掉周末的有效工时天数——函数
alter FUNCTION 返回减周末后月的天数(@date varchar(8))
RETURNS INT
AS
BEGIN
declare @fistM varchar(8) --月的第一天
declare @YY char(4),@MM char(2) --年,月
set @YY=LEFT(@date,4)
set @MM=dateadd(mm,1,@date) --这种截取会让月份是0开头
set @[email protected][email protected]+‘01‘
DECLARE @edate varchar(8),@monthCount INT ,@weekCount int --月的结束时间,月的天数,周末的天数
--取出月的天数 @monthCount
SET @edate =CONVERT(VARCHAR(8), dateadd(D,-1,@fistM),112)
SET @monthCount =CAST(datepart(day,@edate) AS INT)
--月的周末数 @weekCount
set @weekCount=0
declare @wdate varchar(8), @temp_time varchar(8),@WM varchar(6) --周计算(月)第一天,中间变量
set @WM=LEFT(@date,6)
set @[email protected]+‘01‘
set @[email protected]
while left(@wdate,6)=left(@temp_time,6)
begin
IF DATEPART(WEEKDAY,@temp_time)=1 OR DATEPART(WEEKDAY,@temp_time)=7 --第一天是星期几
set @[email protected]+1
set @temp_time=convert(varchar(8),dateadd(D,1,@temp_time),112)
end
return @[email protected]
END

select dbo.返回减周末后月的天数(‘20150105‘)

--统计所有员工 --月度考勤数据
select a.name as 姓名,
convert(char(4),year(a.[date]))+‘年‘+convert(char(2),month(a.[date]))+‘月‘ as 时间,
sum(a.[hours])as 工作时间,
sum(isnull(b.[hours],0)) as 请假时间,
8*dbo.返回减周末后月的天数(CONVERT(varchar(12),min(a.[date]), 112 )) --调用函数取得
-sum(a.[hours])+sum(isnull(b.[hours],0)) as 缺勤时间
from ManHour a
left join AbsenceHourld b
on a.name=b.name
where datepart(weekday, a.[date]) not in (6,7)
group by month(a.[date]),a.name,year(a.[date])

时间: 2024-10-10 17:40:59

工时统计的sql练习--包含时间处理的相关文章

MS SQL Server带有时间的记录怎样查询

原文:MS SQL Server带有时间的记录怎样查询 比如某一张表[A]有一个保存日期包含时间字段[B],如果以这个段[B]作查询条件对数据记录进行查询.也我们得花些心思才能查询到我们想得到的记录. 现在我们需要查询这天2014-06-21的所有记录: SELECT * FROM [A] WHERE [B] = '2014-06-21' 上面的语法,将查询不到任何记录.也许会有网友想到使用BETWEEN: SELECT * FROM [A] WHERE [B] BETWEEN '2014-06

修改Oracle SQL Developer的时间格式

将Tools --> Preferences --> Database --> NLS Parameters 例如: 1.想显示时分秒 Date Format的值由"RR-MM-DD" 改为 "RR-MM-DD HH24:MI:SS",这样显示的时间就包含时分秒了. 2.想显示全部全时间 Date Format的值由"RR-MM-DD" 改为 "YYYY-MM-DD HH24:MI:SS",这样显示的时间就包

SQL导入txt以及SQL中的时间格式操作

原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表名" 比如我文件的具体位置为"f:\\dataset\\beijing\\xx.txt",创建的表名为"person",则上述指令的具体表达为: load data local infile "f:\\dataset\\beijing\\xx.txt

SQL Server 取日期时间

在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可以了: Select Datename(year,GetDate())+'-'+Datename(month,GetDate())+'-'+Datename(day,GetDate()) 另外,DateName()还可以获得到小时.时间.秒.星期几.第几周,分别如下: Select Datename(hou

SQL语句关于时间的查询小心得,希望大家给点意见

查询本月信息:Select * FROM T_Users Where datediff(month,RegisterTime,getdate())=0 昨天的信息:SELECT * FROM T_Users where LastLoginTime>DATEADD(DAY,-2,GETDATE()) AND LastLoginTime<GETDATE() SELECT SUM([DetailMoney]) FROM [dbo].[T_BuyDetails] INNER JOIN [dbo].[T

SQL SERVER 查看SQL语句IO,时间,索引消耗

1.查看SQL语句IO消耗 set statistics io on     select * from dbo.jx_order where order_time>'2011-04-12 12:49:57.580' set statistics io off 2.查看SQL语句时间消耗 set statistics time on      select * from dbo.jx_order where order_time>'2011-04-12 12:49:57.580' set st

--投资情况统计详情sql

--投资情况统计详情sqlselect BidRecord.*, RegInfo.UserName,UserInfo.phone,BorrowInfo.Title,BorrowInfo.BorrowCode from--(select * from [YYD_Account_MoneyRecord] where moneytype='参与投标' and state=1) as MoneyRecord(select * from YYD_Borrow_BidRecord where status=

SQL生成包含年与日的流水号

--************************************************************************************************************* DECLARE @I INT, @YMD VARCHAR(6) SELECT @I=1 SELECT @YMD=convert(char (6), getdate(), 12) WHILE @I<=100 BEGIN INSERT INTO tb2 VALUES('V'+@Y

sql server日期时间转字符串

转自:http://www.cnblogs.com/zhangq723/archive/2011/02/16/1956152.html 一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值   例如:向日期加上2天    select dateadd(day,2,'2004-10-15')  --返回:2004-1