如何格式化列但将其保留为日期时间?

时间:2016-07-14 09:45:18

标签: sql-server formatting

这可能是最愚蠢的问题,但我有一个名为[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转换时转换失败   字符串的日期和/或时间。

有人可以告诉我在按月格式化和分组时是否可以维护日期数据类型,如果是这样的话?

由于

3 个答案:

答案 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')