【问题标题】:How to group by records according to date in Tsql?如何根据Sql中的日期按记录分组?
【发布时间】:2015-12-06 17:18:02
【问题描述】:

我有一张表,每天存储每个员工的 In_time 和 Out_Time。我想每周或每月计算每个员工的工作时间?我该怎么做?

表结构:

               **Empid** :    1     ;    2     ;  3
               **Pdate** : 7 aug 15 ; 8 aug 15 ; 9 aug 15
               **P_In**  : 8:48:21  ; 8:50:10  ; 8:37:00
               **P_Out** : 15:07:21  ; 16:45:18  ; 16:47:10

全年以此类推。 Empid - varchar 日期、P_In、P-Out - 日期时间

现在我想计算每个员工每周、每月或给定日期范围之间的总工作时间。 请有人帮助如何在这种情况下应用“group by”。

我做了什么: 有单独的列存储Pin和Pout之间的差异;说它被称为Workhrs。 所以,Workhrs = Pout - Pin

SELECT emp_name, emp_id, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WorkHRs)) from dailydata group by Emp_Name,Emp_ID

上面的查询将给我每个员工工作的总分钟数数据。但是我想要每周和每月的工作时间。我该怎么做?

【问题讨论】:

  • 您尝试的查询在哪里。显示一些努力
  • 不要将日期和时间存储在两个不同的列中,而是使用一个时间戳列。这样会容易得多。
  • 员工怎么还没来就走了?
  • 即使我删除了 Pdate 列,我仍然有两列带有 Pin 和 Pout。
  • [P_In], [P_Out]varchar or time??的数据类型?

标签: sql sql-server tsql


【解决方案1】:

试试这个。不确定.. 验证您的数据并根据需要进行更改

CREATE TABLE #TEMP(ID INT PRIMARY KEY IDENTITY(1,1),EMPID INT, PDATE DATETIME,PIN DATETIME,POUT DATETIME ) 

INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(1,'2015-09-10 00:00:00','2015-09-10 08:10:00','2015-09-10 16:10:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(2,'2015-09-10 00:00:00','2015-09-10 08:05:00','2015-09-10 16:25:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(3,'2015-09-10 00:00:00','2015-09-10 08:01:00','2015-09-10 16:03:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(1,'2015-09-11 00:00:00','2015-09-11 08:20:00','2015-09-11 16:10:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(2,'2015-09-11 00:00:00','2015-09-11 08:12:00','2015-09-11 16:14:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(3,'2015-09-11 00:00:00','2015-09-11 08:10:00','2015-09-11 16:10:00')
INSERT INTO #TEMP (EMPID , PDATE ,PIN ,POUT )VALUES(1,'2015-09-12 00:00:00','2015-09-12 08:00:00','2015-09-12 16:00:00')

SELECT EMPID,CAST(SUM(DATEDIFF(n,PIN,POUT))/60 AS VARCHAR)+':'+CAST(SUM(DATEDIFF(n,PIN,POUT))%60 AS VARCHAR) AS [HH:MM] FROM  #TEMP WHERE PDATE BETWEEN '2015-09-10 00:00:00' AND '2015-09-12 00:00:00' GROUP BY EMPID

DROP TABLE #TEMP

使用您的日期范围修改 Where 条件

【讨论】:

    【解决方案2】:

    每周:

    select 
      Empid, 
      datepart(ww, Pdate) per_week, 
      sum(DATEDIFF(mi, P_In, P_Out))/60.0 total_time
    from employees
    --where Pdate betweek start_date and end_date
    group by Empid, datepart(ww, Pdate)
    order by Empid
    

    每月:

    select 
      Empid, 
      datepart(mm, Pdate) per_month, 
      sum(DATEDIFF(mi, P_In, P_Out))/60.0 total_time
    from employees
    --where Pdate betweek start_date and end_date
    group by Empid, datepart(mm, Pdate)
    order by Empid
    

    如果您想要两个日期之间的数据,请取消注释 where 子句并替换 start_date and end_date 的日期

    这里假设[P_In], [P_Out]的数据类型是时间数据类型,如果是varchar则使用castcast(P_In as date)

    演示:sqlfiddle

    【讨论】:

    • 我们可以在上面的查询中应用 where 子句,比如针对特定员工吗?
    • 是的...where Empid = 1如果你已经有where子句那么and Empid = 1
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多