【问题标题】:How to split date column & sum it up如何拆分日期列并总结
【发布时间】:2008-10-31 11:47:45
【问题描述】:

我有一个查询,我有一个日期列(时间),它通过这一列告诉人们出席的“IN”和“OUT”时间

我的查询是:-

1) 如何获取每个员工的每日考勤情况 2) 如何知道员工在场时间是否少于 5 小时

请让我知道 SQL Server 中的查询。

【问题讨论】:

  • 为什么两个时间都在一个列中?格式是什么?
  • 是的,需要知道“时间”列的格式/数据类型来编写查询。
  • 如果 IN 多于 OUT 会怎样?
  • 请贴一个行数据的小例子。
  • 日期行示例为 2007-10-24 15:27:10.000 & 数据类型为日期

标签: sql-server tsql


【解决方案1】:

您需要按用户和特定日期的项目对查询进行分组,然后比较最大值和最小值,例如

declare @users table (
    UserId int, 
    DateColumn datetime
)

insert into @users values (1, '2008-10-31 15:15') 
insert into @users values (1, '2008-10-31 10:30') 
insert into @users values (1, '2008-10-30 16:15') 
insert into @users values (1, '2008-10-30 10:30') 

select
  UserID
  , cast(dt as datetime) dt
  , [in]
  , [out]
  , case when datepart(hour, [out]-[in]) >= 5 then 'yes' else 'no' end [5Hours?], 
  ,  cast(datediff(minute, [in], [out]) as float)/60 [hours] 
from (
  select
    UserID
    , convert(varchar, DateColumn, 112) dt
    , min(DateColumn) [in]
    , max(DateColumn) [out] 
  from @users 
  group by 
    UserID, convert(varchar, DateColumn, 112) 
    ) a 

【讨论】:

    【解决方案2】:

    要查找两个日期时间之间的差异,您可以使用以下命令:

    SELECT Datepart(hour, dateTimeEnd - dateTimeStart)
    

    DatePart 函数返回日期时间变量的一部分,dateTimeEnd - dateTimeStart 返回两个日期之间的差作为新的 DateTime

    【讨论】:

      【解决方案3】:
         select 
            datediff(minute, TimeFrom, TimeTo) as AttendedTimeInMinutes,
            case when datediff(minute, sTimeFrom, sTimeTo) < 5 * 60 
               then 
                'less than 5 hours' 
               else '5 hours or more' 
            end
         from YourTable
      

      【讨论】:

      • 如果有 TimeFrom 和 TimeTo 列,这将起作用 - 但问题说它是一个列。
      • @Ken G:好吧,你是对的 - 所以必须有一列“OUT”和“IN”。
      • 使用 SUBSTR/SUBSTRING 函数从列中提取 IN 和 OUT 部分。
      猜你喜欢
      • 2023-04-08
      • 2011-10-07
      • 2021-03-25
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多