MS SQL查询:将日期和时间输出转换为不同的格式

时间:2017-03-24 14:55:13

标签: sql-server sql-server-2012

我进行了一个查询,以获取在2个日期之间放入数据库的MS SQL中的所有数据。

SELECT convert(varchar(30), [date], 113) as "Date"
FROM [I3_IC].[dbo].[Be]
Where [date] >= '2017-03-13T00:00:00.000' AND [date] <= '2017-03-19T00:00:00.000'

输出将是:2017年3月13日10:40:13:017

我希望它是:13-03-2017 10:40

我有什么想法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用FORMAT

SELECT FORMAT(GETDATE(),'dd-MM-yyyy hh:mm') as [Date]
FROM [I3_IC].[dbo].[Be]
WHERE [date] >= '2017-03-13T00:00:00.000' 
AND [date] <= '2017-03-19T00:00:00.000';

顺便说一句,您需要注意选择日期范围时使用的条件(<= '2017-03-19T00:00:00.000'实际上会选择'2017-03-19T00:00:00.000',这是您想要的吗?)

答案 1 :(得分:0)

在sql server 2012之前,连接两个convert() styles

select convert(char(10),getdate(),105)+' '+convert(char(5),getdate(),108)

返回:24-03-2017 16:05

在sql server 2012+中,您可以使用format(),如Lamak的答案。

select format(getdate(),'dd-MM-yyyy HH:mm')

返回:24-03-2017 16:05

format()可能会慢一点,请看一下:format() is nice and all, but… - Aaron Bertand

在对我的系统进行快速测试时,连接convert()format()快得多(除非选择按无格式值排序的前1名)。

+---------+--------------------+------------------+-------------------+-----------------+----------------+----------------------------------------------------------------------------------------------------------------+
|  func   | total_elapsed_time | avg_elapsed_time | total_worker_time | avg_worker_time | total_clr_time |                                                       t                                                        |
+---------+--------------------+------------------+-------------------+-----------------+----------------+----------------------------------------------------------------------------------------------------------------+
| convert |               7000 | 1400.00          |              7000 | 1400.00         |              0 | DECLARE @d CHAR(10);SELECT @d = convert(char(10),d,105)+' '+convert(char(5),d,108) FROM dbo.dtTest ORDER BY d; |
| format  |             135000 | 27000.00         |            135000 | 27000.00        |         128000 | DECLARE @d CHAR(10);SELECT @d = format(d,'dd-mm-yyyy hh:mm') FROM dbo.dtTest ORDER BY d;                       |
| convert |              14000 | 2800.00          |             14000 | 2800.00         |              0 | SELECT d = convert(char(10),d,105)+' '+convert(char(5),d,108) FROM dbo.dtTest ORDER BY d;                      |
| format  |             143000 | 28600.00         |            143000 | 28600.00        |         123000 | SELECT d = format(d,'dd-mm-yyyy hh:mm') FROM dbo.dtTest ORDER BY d;                                            |
| convert |               1000 | 200.00           |              1000 | 200.00          |              0 | SELECT TOP (1) convert(char(10),d,105)+' '+convert(char(5),d,108) FROM dbo.dtTest ORDER BY d;                  |
| format  |               1000 | 200.00           |              1000 | 200.00          |           1000 | SELECT TOP (1) format(d,'dd-mm-yyyy hh:mm') FROM dbo.dtTest ORDER BY d;                                        |
| convert |               4000 | 800.00           |              4000 | 800.00          |              0 | DECLARE @d CHAR(16);SELECT @d = convert(char(10),d,105)+' '+convert(char(5),d,108) FROM dbo.dtTest ORDER BY d; |
| format  |             105000 | 21000.00         |            105000 | 21000.00        |          95000 | DECLARE @d CHAR(16);SELECT @d = format(d,'dd-mm-yyyy hh:mm') FROM dbo.dtTest ORDER BY d;                       |
+---------+--------------------+------------------+-------------------+-----------------+----------------+----------------------------------------------------------------------------------------------------------------+

该测试是Aaron Bertrand撰写的测试脚本的修改。修改后的版本位于pastebin, here.