NVARCHAR TO DATETIME转换

时间:2012-09-27 21:36:50

标签: sql sql-server 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.谢谢!

2 个答案:

答案 0 :(得分:3)

对于已编辑的问题,您只需要删除110规范。确实没有针对您显示的格式的规范,但SQL Server的英语安装将转换它。

e.g。

declare @UpdateTime datetime = '14-Sep-2012 15:47:27'
select CONVERT(datetime,@UpdateTime)

-- result
September, 14 2012 15:47:27

假设您的月份部分长度至少为3个字符,例如Mar,Marc,March,9月,您可以使用以下内容将非常糟糕的文本日期时间转换为正常的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。

答案 1 :(得分: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

有关详细信息,请参阅: