0

我有一个参数,它的值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。谢谢!

4

2 回答 2

3

对于已编辑的问题,您只需删除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。

于 2012-09-27T21:48:25.807 回答
2

只要您的语言设置始终是英语并且您的区域设置不改变,这是另一种方法(以及各种可能格式的示例数据):

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

有关详细信息,请参阅:

于 2012-09-27T23:38:38.827 回答