我有以下脚本,结果为YYYYMMDD
。但是,我需要MMDDYYYY
格式的结果。
有人可以帮忙吗?我希望数字之间没有短划线/笔画/句号。
SELECT CONVERT(VARCHAR(10), RowUpdateDateTime, 112)
from MyTable
结果:20141113
我希望它看起来像11132014
。
我尝试了FORMAT
语法,但它一直在运行。
答案 0 :(得分:3)
看看CONVERT()
documentation:没有一种格式与您正在寻找的完全匹配。看起来110
是最接近的。我们可以通过添加REPLACE()调用来完成:
SELECT REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','') from MyTable
我也想知道你为什么这么做。很多时候,您的客户端代码可以更有效地处理这样的转换。
答案 1 :(得分:1)
这在SQL Server 2012中很简单。
FORMAT
函数接受标准的.NET格式化模式,因此您可以直接指定所需的格式,而不是操纵大致正确的结果。
SELECT FORMAT(RowUpdateDateTime,'MMddyyyy','en-us')
但是我刚刚注意到您的评论已经尝试了这一点,并遇到了性能问题。
这是我迄今为止尝试过的最快的一次。
SELECT CONCAT(CASE
WHEN MONTH(D) < 10
THEN '0'
END, MONTH(D), CASE
WHEN DAY(D) < 10
THEN '0'
END, DAY(D), YEAR(D))
对10,000,000个日期进行测试需要12秒,而REPLACE(CONVERT(VARCHAR(10), RowUpdateDateTime, 110),'-','')
为21秒,FORMAT
版为180秒。
WITH
E1(N) AS
(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
) -- 1*10^1 or 10 rows
, E2(N) AS (SELECT 1 FROM E1 a, E1 b) -- 1*10^2 or 100 rows
, E4(N) AS (SELECT 1 FROM E2 a, E2 b) -- 1*10^4 or 10,000 rows
, E8(N) AS (SELECT 1 FROM E4 a, E4 b) -- 1*10^8 or 100,000,000 rows
, Dates(D) AS
(
SELECT TOP (10000000) DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),0) AS N FROM E8
)
SELECT
--12 Seconds
MAX(CONCAT(CASE WHEN MONTH(D) < 10 THEN '0' END, MONTH(D), CASE WHEN DAY(D) < 10 THEN '0' END, DAY(D), YEAR(D)))
--21 Seconds
--MAX(REPLACE(CONVERT(VARCHAR(10), D, 110),'-',''))
--180 Seconds
--MAX(FORMAT(D,'MMddyyyy', 'en-us')) --18
FROM Dates