修改查询以获得这样的输出

时间:2011-11-18 07:00:11

标签: sql-server

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

如何修改我的查询?

1 个答案:

答案 0 :(得分:0)

最好向我们提供in_time_tempout_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表中与自己匹配一天(意味着登录),而不是使用dayyearout_time_temp函数并且注销必须在同一天发生),最好采取整个日期(只是日期,而不是时间)并将其用作过滤器。请参阅,我从WHERE子句中删除了日期匹配,并将其包含在LEFT OUTER JOIN部分中,因为它也是用于指示JOIN如何工作的关键之一。同样,我在结尾处做了一个快捷方式(ORDER BY子句)但是如果它没有按你想要的方式排序,请告诉我如何。