select convert(nvarchar(25),in_gentime, 107) AS LogInDate,
convert(nvarchar(25),in_gentime, 108) as LogInTime,
convert(nvarchar(25),out_gentime, 107) AS LogOutDate,
convert(nvarchar(25),out_gentime, 108) as LogOutTime
from in_time_temp i, out_time_temp o where in_gentime between '10/01/2011 00:01' and '11/18/2011 23:59'
and i.cardnumber = 'MCL1570' and out_gentime between '10/01/2011 00:01' and '11/18/2011 23:59' and o.cardnumber = 'MCL1570'
and month(in_gentime) = month(out_gentime) and day(in_gentime) = day(out_gentime)
and year(in_gentime) = year(out_gentime) order by year(in_gentime), year(out_gentime),
month(in_gentime), month(out_gentime), day(in_gentime), day(out_gentime)
此查询将返回如下:
Login Date LoginTime Logout date logouttime
Oct 11, 2011 08:06:00 Oct 11, 2011 22:02:00
Oct 12, 2011 08:35:00 Oct 12, 2011 21:14:00
Oct 14, 2011 08:21:00 Oct 14, 2011 21:59:00
Oct 15, 2011 08:21:00 Oct 15, 2011 21:59:00
假设记录是针对in_time_temp并且记录不存在于out_time_temp表意味着它应该显示这样的输出....
在这种情况下,登录时间是2011年10月13日在此in_time_temp中,但此out_time_temp中没有登出时间
如何修改以获得这样的输出:
Login Date LoginTime Logout date logouttime
Oct 11, 2011 08:06:00 Oct 11, 2011 22:02:00
Oct 12, 2011 08:35:00 Oct 12, 2011 21:14:00
Oct 13, 2011 08:21:00
Oct 14, 2011 08:21:00 Oct 14, 2011 21:59:00
Oct 15, 2011 08:21:00 Oct 15, 2011 21:59:00
如何修改我的查询?
答案 0 :(得分:0)
最好向我们提供in_time_temp
和out_time_temp
的表格定义,以便我们更快地完成工作。然而,在等待的时候,这是另一个尝试。
以下是我对表格最低要求的假设:
CREATE TABLE in_time_temp (
cardnumber VARCHAR(10)
, in_gentime DATETIME
)
CREATE TABLE out_time_temp (
cardnumber VARCHAR(10)
, out_gentime DATETIME
)
以下代码应该为您提供所需的答案。
SELECT
i.cardnumber
, CONVERT(nvarchar(25),in_gentime, 107) AS LogInDate
, CONVERT(nvarchar(25),in_gentime, 108) AS LogInTime
, CONVERT(nvarchar(25),out_gentime, 107) AS LogOutDate
, CONVERT(nvarchar(25),out_gentime, 108) AS LogOutTime
FROM in_time_temp i LEFT OUTER JOIN out_time_temp o
ON i.cardnumber = o.cardnumber
AND CONVERT(VARCHAR, in_gentime, 112) = CONVERT(VARCHAR, out_gentime, 112)
WHERE
i.cardnumber = 'MCL1570'
ORDER BY 1, 2
我尽可能地简化了您的查询..请尝试一下,让我们知道它是怎么回事。
[详细]:
(基于您的初始SQL代码),您只能在month
表中与自己匹配一天(意味着登录),而不是使用day
,year
和out_time_temp
函数并且注销必须在同一天发生),最好采取整个日期(只是日期,而不是时间)并将其用作过滤器。请参阅,我从WHERE
子句中删除了日期匹配,并将其包含在LEFT OUTER JOIN
部分中,因为它也是用于指示JOIN如何工作的关键之一。同样,我在结尾处做了一个快捷方式(ORDER BY
子句)但是如果它没有按你想要的方式排序,请告诉我如何。