我在这里有点混乱?
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
?
提前致谢
答案 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如何存储日期的进一步研究有助于您理解。