2013-09-26 63 views
1

下面是一个表格示例。使用sql-server 我想拉下面的每个员工的最大(登录日期),但数据库中的“登录日期”是数据类型int。 我可以用一个变量来保存一年选择它足够简单,即select语句中的sql转换

select employee,title,max(login_date) from employee group by employee,title 

我可以使用子到login_date(“YYYYMM”)转换成日期变量,

set @var_year=select (substring((select login_date),1,4)) 

和一个存储月份的变量,但是如何将它传递给我的主要select语句?

Employee Title   Login_Date    
----------------------------------------- 
Mike  VP   201301 
Amy  CEO   201201      
Joe  Office Mgr 201105 
Andy  Admin Asst 201308 
Joe  Office Mgr 201205 
Andy  Admin Asst 201309 
Joe  Office Mgr 201205 
Andy  Admin Asst 201309 
+0

然后查询它的更好方法是什么,因为我希望新的“日期”字段是正确的,而不是仅从第一个结果中抓取 – Phil

+0

您能显示预期结果吗? – Kaf

回答

1

有几种方法可以做到这一点。 其中之一是

Select m.employee,m.title, 
convert(int,substring(thisisNOTadate,1,4)) as [Year], 
convert(int,substring(thisisNOTadate,5,2)) as [Month] 
From 
(select employee,title,max(login_date) as ThisisNOTadate 
from employee group by employee,title 
) m 

掴谁曾经被称为格式YYYYMM字符串login_date了几次之后就个人而言,我会返工表,以便login_date实际上的东西日期像Convert(DateTime,Convert(VarChar(6), Login_date) + '01'),然后任何日期中需要的部分可以使用标准的日期函数。

因此,基于对ReBand先生您的评论较早然后

select employee,title, 
     max(convert(datetime,Convert(varchar(6),login_date) + '01')) as arealdate 
From employee group by employee,title 

将是另一个。

+0

我完全同意托尼。它在我们的程序中是一个日期字段,但它会转到数据库中的一个int字段。谢谢托尼,我想我可以使用它。 – Phil

+0

我打算给你带一块Reband先生。我并不乐意不加入风格,即使没有连字符分隔符,也不知道它会满意126。 –

+0

convert(datetime,Convert(varchar(6),login_date)+'01'),126)对于那些看不到已删除帖子的人 –