2016-07-14 41 views
1

这可能是最愚蠢的问题,但有一个所谓的[开始时间]列这是在形式(日期时间,不为空),并输出数据“2016年5月25日00:12:01.977”如何格式化一列但保留为日期时间?

什么我想要的是将月份和年份以及组数据中的所有内容都分成几个月。我使用的是

select format([Start Time],'MMM/yyyy') as [Month] 

这只是它现在似乎不再是一个日期时间字段工作得很好,当我添加

order by format([Start Time],'MMM/yyyy') 

它把个月按字母顺序排列,而不是一月二月等等。我试着用

convert(date,format([Start Time],'MMM/yyyy')) 

但带回来的错误

Msg 241,Level 16,State 1,Line 1转换 日期和/或时间从字符串转换失败。

任何人都可以告诉我,如果有可能保持日期数据类型格式化和按月份分组,如果是的话如何?

感谢

+0

你用分组实现了什么,计数记录? – Ajay2707

回答

2

在SQL Server处理日期,需要一点点的工作,但你还可以通过修改日期为本月1日起得到解决你的问题,分组与,最后格式化,这样的事情:

select 
    format(Month2,'MMM/yyyy') as Month, 
    amount 
from 
(
    select 
    DATEADD(month, DATEDIFF(month, 0, [Start Time]), 0) as Month2, 
    sum(amount) as amount 
    from 
    yourtable 
    group by 
    DATEADD(month, DATEDIFF(month, 0, [Start Time]), 0) 
) X 
order by 
    Month2 

格式也相当繁重的操作,你应该考虑使用转换或d atepart如果你有很多行。

+0

所以我试着选择 格式(Month,'MMM/yyyy')为Month, [Calls Offered ], [呼叫回答] 从 ( 选择 DATEADD(月,DATEDIFF(每月,0,[开始时间]),0)为月, 总和(IIF([2型](“普通话务员呼叫','来电响起','呼入者在转移期间响起','没有合适的操作员登录'),1,0))作为[呼叫提供], sum(iif([Type] in('Normal operator call '),1,0))as [Calls Answered] from inboundcallsview 组由 DATEADD(月,DATEDIFF(每月,0,[开始时间]),0) \t)X \t订购Month',但还是得到了按字母顺序排列。 – tomdemaine

+0

如果转换或datepart会更好地工作,我会很高兴为使用它们的答案。我只使用格式,因为我知道它的工作。 – tomdemaine

+0

对不起,我在内部和外部查询中使用了同一个月份的别名,当然这个顺序并不真正起作用。我现在更新了查询。 –

0

您可以检查此:

Declare @t table(dtvalue datetime) 

insert into @t values ('2016-05-01 00:12:01.977'), ('2016-05-06 00:12:01.977'), ('2016-05-10 00:12:01.977'), ('2016-05-15 00:12:01.977'), 
('2016-05-25 00:12:01.977'), ('2016-06-25 00:12:01.977'), ('2016-06-28 00:12:01.977') 

--select * from @t 

select dtvalue, 
format(dtvalue,'MMM/yyyy') 
from @t 
group by dtvalue 

insert into @t values ('2016-05-02 00:12:01.977') 

select dtvalue, 
format(dtvalue,'MMM/yyyy') 
from @t 
group by dtvalue 

/*Count the record in a month via grouping*/ 
select count (format(dtvalue,'MMM/yyyy')), 
format(dtvalue,'MMM/yyyy') 
from @t 
group by format(dtvalue,'MMM/yyyy') 
+0

您没有订购,所以结果是以随机顺序 –

+0

当您按值进行分组时,无需订购。请添加一些行来了解 – Ajay2707

+0

好吧,OP想按月排序,所以需要订购它们 –

1
select format([Start Time],'MMM/yyyy') as [Month] 
order by month([Start Time]), year([Start Time]) 
相关问题