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

--建表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 @fistM=@YY+@MM+'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 @wdate=@WM+'01'
set @temp_time=@wdate
while left(@wdate,6)=left(@temp_time,6)
begin
IF DATEPART(WEEKDAY,@temp_time)=1 OR DATEPART(WEEKDAY,@temp_time)=7 --第一天是星期几
set @weekCount=@weekCount+1
set @temp_time=convert(varchar(8),dateadd(D,1,@temp_time),112)
end
return @monthCount-@weekCount
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])

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

  1. 梁敬彬老师的《收获,不止SQL优化》,关于如何缩短SQL调优时间,给出了三个步骤,

    梁敬彬老师的<收获,不止SQL优化>,关于如何缩短SQL调优时间,给出了三个步骤, 1. 先获取有助调优的数据库整体信息 2. 快速获取SQL运行台前信息 3. 快速获取SQL关联幕后信息 ...

  2. SQL Server 取日期时间部分

    在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate() 用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可以了: ...

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

    原文:SQL导入txt以及SQL中的时间格式操作 MySQL中导入txt的指令为: load data local infile "路径名称" into table "表 ...

  4. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  5. sql server获取时间格式

    在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的年.月.日,然后再把它们连接起来就可以了: ...

  6. SQL 时间范围和时间粒度

    前言 使用 SQL 进行业务数据计算时,经常会遇到两个概念:时间范围 和 时间粒度 .以 最近一天的每小时的用户访问人数 为例: 最近一天 是时间范围 每小时 是时间粒度 常见的时间范围:最近五分钟. ...

  7. sql server日期时间转字符串

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  8. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

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

    比如某一张表[A]有一个保存日期包含时间字段[B],如果以这个段[B]作查询条件对数据记录进行查询.也我们得花些心思才能查询到我们想得到的记录. 现在我们需要查询这天2014-06-21的所有记录: ...

随机推荐

  1. Oracle 精简绿色版客户端的配置

    在项目开发中常常用到Oracle.但Oracle 客户端体积很大.安装后,主要用的就1个功能:TNS配置服务名,偶尔用到SqlPlus.在开发过程中,大量使用Navicate和PL/SQL Devel ...

  2. Web.config总结

    %windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG目录下machine.config定义了针对当前机器的WinForm程序和asp.net应用程序的配 ...

  3. Solr4.6从数据库导数据的步骤

    http://blog.csdn.net/bruce128/article/details/17796705 Solr4.6有从数据库导数据的功能.导入步骤如下: 1.将下载下来的solr4.6的di ...

  4. Little Kings

    sgu223:http://acm.sgu.ru/problem.php?contest=0&problem=223 题意:n*n的格子放k个国王,一共有多少种放发. 题解:简单的状压DP. ...

  5. Request.url用法

    原文:Request.url用法 我們在開發網頁應用程式,時常需要去解析網址(Request.Url)的每個片段,進行一些判斷.例如說 "http://localhost:1897/News ...

  6. 16.缓存(Cache)

    如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差.而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论有多少人访问 ...

  7. linux eclipse c++配置

    安装cdt: https://www.eclipse.org/cdt/downloads.php 新建一个c++工程,运行发生错误: Eclipse CDT launch failed.Binary  ...

  8. Record Locks

    Record Locks 记录锁: 记录锁是一个锁在一个Index记录上,比如 SELECT c1 FOR UPDATE FROM t WHERE c1 = 10; 阻止任何其他事务inserting ...

  9. (转载)在Linux下删除文件行末尾的^M符号方法

    (转载)http://www.xinfengit.com/200907/1433646.html 由于DOS下的编辑器和linux(linux教程 linux培训 )编辑器对文件行末的回车符处理不一致 ...

  10. ArrayList 、Vector、 LinkList

    public class TestList {     public static void init(List list)     {         if(list!=null)          ...