使用Convert()函数的T-SQL日期?

时间:2016-01-21 14:22:10

标签: sql sql-server tsql

我在这里有点混乱?

declare @date1 datetime = '2016-01-21 14:10:47.183'

我想将'2016-01-21 14:10:47.183'转换为'21-01-2016'

当我尝试时:select convert(date,@date1,105) 我得到了:2016-01-21

但是:select convert(varchar(10),@date1,105) 我得到了:21-01-2016

为什么我上面的代码没有相同的结果?

我为什么要转换为varchar

提前致谢

2 个答案:

答案 0 :(得分:2)

这只是演示问题,应该在应用层完成。如果您无法在应用程序中执行此操作,则可以使用FORMAT(SQL Server 2012 +):

declare @date1 datetime = '2016-01-21 14:10:47.183'

SELECT FORMAT(@date1, 'dd-mm-yyyy');

LiveDemo

  

为什么我上面的代码没有相同的结果?

select convert(date,@date1,105)
-- DATETIME -> DATE
-- vs
select convert(varchar(10),@date1,105)
-- DATETIME -> VARCHAR(10) using specific style

如果您只是跳过时间部分使用SELECT CAST(@date1 AS DATE)而不打扰如何呈现。它仍然是DATE

总结:在SQL查询中使用DATE作为日期,在应用程序中以所需格式显示它。

答案 1 :(得分:1)

原因是因为在SQL Server中将值放入datetime列(或date或日期时间数据类型的任何其他变体)之后。 SQL Server不再认为该日期具有任何特定格式。它将其转换为数字,并以内部方式存储。

因此,当您从日期时间列中选择日期时,SQL Server会根据您的环境/本地设置以您选择的默认格式显示该日期。

如果要以任何其他格式显示它,则必须先将其转换为字符串,因为就SQL Server而言,日期不具有格式。他们只是数字。 3月21日是3月21日,无论你是把它写成3/21还是21/3。

因此,当您尝试将日期转换为具有不同格式的日期时,SQL Server会忽略您,因为日期不具有格式。但是,如果要将该日期转换为字符串,SQL Server将很乐意帮助您以任何您喜欢的格式显示该字符串。

希望这会有所帮助,但听起来像是对SQL Server如何存储日期的进一步研究有助于您理解。