MSSQL:服务器之间关于日期转换的差异
MSSQL: difference between servers regarding date conversion
我有这个脚本:
SELECT UserID,
CONVERT(SmallDateTime, cast([1] + '/' + [2] + '/' + [3] as varchar)) as ReleaseDate,
ChannelID
FROM
(
SELECT RU.UserID, U.FieldID, RU.ChannelID, U.AnswerText
FROM dbo.Users U WITH (NOLOCK) INNER JOIN dbo.ResourceUsers RU WITH (NOLOCK)
ON U.UserID = RU.UserID
WHERE (FieldID = 1 -- release day
OR FieldID = 2 -- release month
OR FieldID = 3)
) AS P
PIVOT
(
MAX(AnswerText) FOR FieldID in ([1], [2], [3])
) AS pvt
同样的脚本在服务器上完美运行。在其他服务器上,我收到此错误:
Msg 295, Level 16, State 3, Line 3 Conversion failed when converting
character string to smalldatetime data type.
为什么?有什么不同?
这些表在两台服务器上具有相同的结构。
在 sql 服务器 2012+ 中你可以使用 datefromparts
SELECT UserID,
convert(smalldatetime,datefromparts([3],[2],[1])) as ReleaseDate,
ChannelID
FROM ....
在 sql 服务器 2012 之前,您可以创建 'yyyyMMdd' 格式的字符串
SELECT UserID,
convert(smalldatetime,
convert(char(4),[3])
+ right('0'+convert(varchar(3),[2]),2)
+ right('0'+convert(varchar(3),[1]),2)
) as ReleaseDate,
ChannelID
FROM ....
我有这个脚本:
SELECT UserID,
CONVERT(SmallDateTime, cast([1] + '/' + [2] + '/' + [3] as varchar)) as ReleaseDate,
ChannelID
FROM
(
SELECT RU.UserID, U.FieldID, RU.ChannelID, U.AnswerText
FROM dbo.Users U WITH (NOLOCK) INNER JOIN dbo.ResourceUsers RU WITH (NOLOCK)
ON U.UserID = RU.UserID
WHERE (FieldID = 1 -- release day
OR FieldID = 2 -- release month
OR FieldID = 3)
) AS P
PIVOT
(
MAX(AnswerText) FOR FieldID in ([1], [2], [3])
) AS pvt
同样的脚本在服务器上完美运行。在其他服务器上,我收到此错误:
Msg 295, Level 16, State 3, Line 3 Conversion failed when converting character string to smalldatetime data type.
为什么?有什么不同? 这些表在两台服务器上具有相同的结构。
在 sql 服务器 2012+ 中你可以使用 datefromparts
SELECT UserID,
convert(smalldatetime,datefromparts([3],[2],[1])) as ReleaseDate,
ChannelID
FROM ....
在 sql 服务器 2012 之前,您可以创建 'yyyyMMdd' 格式的字符串
SELECT UserID,
convert(smalldatetime,
convert(char(4),[3])
+ right('0'+convert(varchar(3),[2]),2)
+ right('0'+convert(varchar(3),[1]),2)
) as ReleaseDate,
ChannelID
FROM ....