如何从Datetime列按日期分组并按Datetime排序,展示完整日期时间?
按日期分组、显示最早时间并排序的SQL解决方案
嘿,我明白你的需求了——你想要按Date列的日期部分分组,拿到每个日期对应的最早完整时间(带时分),还要按时间排序,输出类似15/01/2018 18:52这样的格式对吧?
先说说你原来SQL的小问题
你之前写的:
SELECT MIN(CAST(Date AS DATE)) FROM [TEST].[dbo].[PROD] GROUP BY CAST(Date AS DATE)
这里把Date转成DATE类型后,时间部分就被去掉了,所以MIN(CAST(Date AS DATE))其实和分组的日期值完全一样,自然拿不到带时间的结果。我们需要调整思路,直接取每个日期分组里最早的完整datetime记录。
修正后的SQL语句
方案1:分开显示日期和时间
如果想把日期和时间分成两列输出,可以用这个:
SELECT CAST(Date AS DATE) AS [日期], MIN(Date) AS [当日最早时间] FROM [TEST].[dbo].[PROD] GROUP BY CAST(Date AS DATE) ORDER BY [日期] -- 或者 ORDER BY MIN(Date),效果完全一致
执行后会得到两列数据,一列是纯日期,另一列是带时分的完整时间。
方案2:合并成你想要的格式输出
如果希望直接输出日期 时间的格式,比如15/01/2018 18:52,可以直接取每个分组的最小datetime,再按需格式化:
SELECT FORMAT(MIN(Date), 'dd/MM/yyyy HH:mm') AS [日期时间] FROM [TEST].[dbo].[PROD] GROUP BY CAST(Date AS DATE) ORDER BY MIN(Date)
这里的FORMAT函数适用于SQL Server 2012及以上版本,能帮你把datetime转换成指定的字符串格式。如果是更早的SQL Server版本,也可以用CONVERT函数来调整格式:
SELECT CONVERT(VARCHAR(16), MIN(Date), 103) AS [日期时间] FROM [TEST].[dbo].[PROD] GROUP BY CAST(Date AS DATE) ORDER BY MIN(Date)
103是SQL Server里对应dd/mm/yyyy格式的代码,VARCHAR(16)会保留到分钟部分,刚好符合你的需求。
结果验证
不管用哪个方案,最终排序后的结果都会是你期望的样式:
日期时间 15/01/2018 18:52 16/01/2018 18:52 17/01/2018 xx:xx ...
内容的提问来源于stack exchange,提问作者rich dave
相关产品推荐
相关产品推荐

