我有一个日期格式要求,最初看起来很简单,但事实证明是一种痛苦。我使用的是SQL Server 2012,但需要支持2008年。
查看引用(https://msdn.microsoft.com/en-GB/library/ms187928.aspx)我可以使用CONVERT将日期时间格式化为多种不同格式的字符串,但我似乎无法获得DD MM YYYY而没有解决方法。是否有某些代码未包含在该引用中,而我在某处丢失了?
我可以看到的解决方法如下,但如果有一种明智的方法可以使用T-SQL,我显然不会热衷于使用这些。
SELECT REPLACE(CONVERT(varchar, GETDATE(), 103), '/',' ')
SELECT RIGHT('0' + CONVERT(varchar, DATEPART(dd, GETDATE())), 2) + ' ' + RIGHT('0' + CONVERT(varchar, DATEPART(mm, GETDATE())), 2) + ' ' + CONVERT(varchar, DATEPART(yyyy, GETDATE()))
在评论之后,示例输入日期将是2016年6月21日(年= 2016年,月= 06,日= 21),其中期望的输出将是2016年6月21日。
答案 0 :(得分:3)
日期格式DD MM YYYY
不是“官方”格式(只有空格而没有句点),因此SQL Server中没有格式代码。
您可以使用问题中提到的解决方法或SQL Server 2012或更高版本中的FORMAT
函数:FORMAT(GETDATE(), N'dd MM yyyy')
。
还有其他解决方法,但它们都不是很漂亮,包括这个装置:RIGHT('0' + CONVERT(VARCHAR(2), DAY(@date)), 2) + ' ' + RIGHT('0' + CONVERT(VARCHAR(2), MONTH(@date)), 2) + ' ' + CONVERT(VARCHAR(4), YEAR(@date))
另一种选择是创建 CLR函数并使用.NET格式化日期。 CLR自2005年开始提供。
您可以创建日历表并添加所需格式的字段。您可以加入此表以获取每个日期的格式化字符串。
通常,格式化结果不是SQL Server的责任,将其移动到使用数据的应用程序中。
答案 1 :(得分:2)
我提出你的第一个建议,似乎是最合适的;
制作一些测试数据;
IF OBJECT_ID('tempdb..#Dates') IS NOT NULL DROP TABLE #Dates
GO
CREATE TABLE #Dates (OriginalDate datetime)
INSERT INTO #Dates (OriginalDate)
VALUES
('2016-01-01')
,('2016-05-06')
,('2016-08-09')
,('2016-12-25')
查询;
SELECT
OriginalDate
,REPLACE(CONVERT(varchar,OriginalDate,103),'/',' ') NewDate
FROM #Dates
结果;
OriginalDate NewDate
2016-01-01 00:00:00.000 01 01 2016
2016-05-06 00:00:00.000 06 05 2016
2016-08-09 00:00:00.000 09 08 2016
2016-12-25 00:00:00.000 25 12 2016