【发布时间】:2012-12-21 00:46:24
【问题描述】:
问题来了,
我有一个名为 attendance 的表,有 4 列:
[Username] varchar(256)
[Date] varchar(256)
[Time] varchar(256)
[Action] varchar(256)
我希望实现的是获得第一次入住和退房时间和最后一次入住和退房时间。如果表中只有一个签入和签出行,则返回相同。
这样的示例数据:
Username | Date | Time | Action
--------------------------------------------
User1 | 01/12/2012 | 12:54:41 | Check In
User1 | 01/12/2012 | 18:26:36 | Check Out
User1 | 01/12/2012 | 18:44:17 | Check In
User1 | 01/12/2012 | 22:05:31 | Check Out
我的预期结果如下所示:
Output:
Username | Date | First In | First Out | Last In | Last Out
User1 | 01/12/2012 | 12:54:41 | 18:26:36 | 18:44:17 | 22:05:31
我尝试了这条 SQL 语句:
SELECT [USERNAME], [DATE]
, min(case when [action] = 'Clock In' then [time] else '' end) as 'First in'
, min(case when [action] = 'Clock Out' then [time] else '' end )as 'First out'
, max(case when [action] = 'Clock In' then [time] else '' end) as 'Last in'
, max(case when [action] = 'Clock Out' then [time] else '' end )as 'Last out'
FROM attendance
WHERE [USERNAME] = 'User1' AND [DATE] = '01/12/2012'
group by [username],[date]
它返回意外的结果,即我的最小值总是 '' 或为空,但我的最大值都是 “后进”和“后出”的值正确。
Output:
Username | Date | First In | First Out | Last In | Last Out
User1 | 01/12/2012 | | | 18:44:17 | 22:05:31
我的 SQL 有什么问题吗?
谁能给点建议?
【问题讨论】:
-
将日期和时间存储为 DateTime?
-
@TonyHopkinson Nope..both in varchar(256)
-
我认为 Tony 的评论是对改进数据库的一种方法的建议 - 您确实应该使用适当的日期类型来存储值,而不是使所有内容
varchar(256)。除非您认为'the day after my birthday'(例如)是一个适合存储在Date列中的值。 -
@marc_s 表示感谢,这是一篇不错的文章。
标签: sql sql-server-2008 datetime max min