【问题标题】:Transpose time stamp data in SQL Server 2012在 SQL Server 2012 中转置时间戳数据
【发布时间】:2016-12-28 00:11:16
【问题描述】:

我有另一组数据,其中有多个时间戳。

Name    Timestamp               Status
------------------------------------------
Ahmed   02/11/2016 1:03:37 PM   Check In
Ahmed   02/11/2016 3:42:21 PM   Check In
Ahmed   02/11/2016 7:00:49 PM   Check In
Ahmed   02/11/2016 7:00:55 PM   Check In
Ahmed   03/11/2016 12:01:03 AM  Check Out
Ahmed   03/11/2016 11:50:32 PM  Check In
Ahmed   04/11/2016 11:45:00 AM  Check Out

我正在尝试获得如下输出

Name    Check in date   check out date  check in time   check out time
-----------------------------------------------------------------------
Ahmed   02/11/2016      03/11/2016       1:03:37 PM     12:01:03 AM
Ahmed   03/11/2016      04/11/2016      11:50:32 AM     11:45:00 PM

请帮忙

【问题讨论】:

  • 你在发帖之前做了什么尝试来解决这个问题,你遇到了什么错误?我建议你谷歌SQL gaps and islands problem

标签: sql sql-server sql-server-2012


【解决方案1】:

试试这个:

select convert(varchar(10), checkin, 101) check_in_date,
convert(varchar(10), checkin, 101) check_out_date,
LTRIM(RIGHT(CONVERT(CHAR(20), checkin, 22), 11)) check_in_time,
LTRIM(RIGHT(CONVERT(CHAR(20), checkin, 22), 11)) check_out_time
from (
select name, 
min(case when status = 'Check In' then timestamp end) checkin,
max(case when status = 'Check Out' then timestamp end) checkOut
from table
group by name, convert(varchar(10), timestamp, 101)) t;

【讨论】:

  • 在所有案例语句中都有 ELSE 分支是个好主意。
  • 每个name只会产生一行。
  • 亲爱的 Gurwinder... 我在示例中给出的条件下尝试了这个,它给出了一个输出,第一个日期作为签入,最后一个日期作为签出。但是我发现一些时间戳在签入或签出状态时丢失。
【解决方案2】:
Select Name
      ,CheckInDate  = format(min(TimeStamp),'dd/MM/yyyy')
      ,CheckOutDate = format(CheckOut,'dd/MM/yyyy')
      ,CheckInTime  = format(min(TimeStamp),'hh:mm:ss tt')
      ,CheckOutTime = format(CheckOut,'hh:mm:ss tt')
 From (
        Select *
              ,CheckOut=(Select min(TimeStamp) From @YourTable where Status='Check Out' and TimeStamp>=A.TimeStamp and Name=A.Name)
         From @YourTable A
      ) A
 Group By Name,CheckOut

返回

Name    CheckInDate   CheckOutDate      CheckInTime    CheckOutTime
Ahmed   02/11/2016    03/11/2016        01:03:37 PM    12:01:03 AM
Ahmed   03/11/2016    04/11/2016        11:50:32 PM    11:45:00 AM

【讨论】:

  • 亲爱的约翰....感谢您提供上述解决方案。它适用于我在示例中给出的条件,但是对于某些时间戳,没有签入或签出状态。你能帮忙吗
  • @Michael 也许您可以使用更好的样本集以及您希望如何处理/显示这些异常来编辑您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2015-09-09
  • 2015-06-22
相关资源
最近更新 更多