这可能是最愚蠢的问题,但我有一个名为[Start Time]的列,它是(datetime,not null)并以“2016-05-25 00:12:01.977&#”形式输出数据39;
我想要的是剪掉除月和年以外的所有内容,并将数据分组为几个月。我用的是
select format([Start Time],'MMM/yyyy') as [Month]
除了现在似乎不再是日期时间字段以及我添加
时,哪个工作正常order by format([Start Time],'MMM/yyyy')
它按月的字母顺序排列,而不是Jan Feb等。我尝试使用
convert(date,format([Start Time],'MMM/yyyy'))
但是这又带来了错误
消息241,级别16,状态1,行1转换时转换失败 字符串的日期和/或时间。
有人可以告诉我在按月格式化和分组时是否可以维护日期数据类型,如果是这样的话?
由于
答案 0 :(得分: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
格式也是非常繁重的操作,如果你有很多行,你应该考虑使用convert或datepart。
答案 1 :(得分:1)
select format([Start Time],'MMM/yyyy') as [Month]
order by month([Start Time]), year([Start Time])
答案 2 :(得分: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')