我有一个参数,它的值14-Sep-2012 15:47:27
是我想用它更新2012-08-10 05:00:00.000
格式的表列。
需要什么查询'
@UpdateTime = '14-Sep-2012 15:47:27'
Update tbl
Set Datetimecol = CONVERT(datetime,@UpdateTime,110) ??
我正在使用 SQL Server 2008。谢谢!
我有一个参数,它的值14-Sep-2012 15:47:27
是我想用它更新2012-08-10 05:00:00.000
格式的表列。
需要什么查询'
@UpdateTime = '14-Sep-2012 15:47:27'
Update tbl
Set Datetimecol = CONVERT(datetime,@UpdateTime,110) ??
我正在使用 SQL Server 2008。谢谢!
对于已编辑的问题,您只需删除110
规范。您显示的格式确实没有规范,但 SQL Server 的英文安装会转换它。
例如
declare @UpdateTime datetime = '14-Sep-2012 15:47:27'
select CONVERT(datetime,@UpdateTime)
-- result
September, 14 2012 15:47:27
假设您的月份部分至少有 3 个字符长,例如 Mar、Marc、March、Sept,您可以使用以下命令将非常糟糕的文本日期时间转换为正常的 3 字符月份格式
declare @updatetime nvarchar(20) = '18-Sept-2012'
declare @fixedtime nvarchar(20)
set @fixedtime = stuff(@updatetime,1,charindex('-',@updatetime),'')
set @fixedtime = Left(@updatetime,charindex('-',@updatetime))
+ stuff(@fixedtime,4,len(@fixedtime)-8,'')
-- @fixedtime contains `18-Sep-2012`
Update tbl
Set Datetimecol = @fixedtime
是的,我故意在更新语句中省略了 CAST/CONVERT。
只要您的语言设置始终是英语并且您的区域设置不改变,这是另一种方法(以及各种可能格式的示例数据):
DECLARE @x TABLE(y NVARCHAR(15));
INSERT @x VALUES('18-Sept-2012'),('9-May-2012'),('19-Oct-2012'),('04-March-2012');
SELECT z, CONVERT(DATETIME,z) FROM
(
SELECT SUBSTRING(y,s+1,3) + ' ' + LEFT(y,s-1) + ', ' + RIGHT(y,4) FROM
(
SELECT y, CHARINDEX('-',y) FROM @x
) AS y(y,s)
) AS z(z);
结果:
Sep 18, 2012 2012-09-18 00:00:00.000
May 9, 2012 2012-05-09 00:00:00.000
Oct 19, 2012 2012-10-19 00:00:00.000
Mar 04, 2012 2012-03-04 00:00:00.000
您可以对变量使用相同的计算:
DECLARE
@y NVARCHAR(15) = N'18-Sept-2012',
@z DATETIME;
SELECT @z = CONVERT(DATETIME,z) FROM
(
SELECT SUBSTRING(y,s+1,3) + ' ' + LEFT(y,s-1) + ', ' + RIGHT(y,4) FROM
(
SELECT @y, CHARINDEX('-',@y)
) AS y(y,s)
) AS z(z);
SELECT @z;
-- UPDATE ...
(现在试一试,SET LANGUAGE FRENCH;
看看这一切都到了,嗯,某个地方。)
出于这个原因,我强烈建议您停止使用该nvarchar
类型存储/传递日期。我们有强类型的日期/时间类型是有原因的。当您需要传递字符串文字时,您应该使用不易出现语言、区域和日期格式设置差异的明确标准格式。在这种情况下,正确的格式应该是YYYYMMDD
:
20120918
有关详细信息,请参阅: