2012-09-27 242 views
0

我有一个参数值为14-Sep-2012 15:47:27,我想更新一个表格列,其格式为2012-08-10 05:00:00.000NVARCHAR TO DATETIME转换

将查询需要什么样的“

@UpdateTime = '14-Sep-2012 15:47:27' 

Update tbl 
Set Datetimecol = CONVERT(datetime,@UpdateTime,110) ?? 

我使用SQL Server 2008的,谢谢!

+2

那是什么您遇到的问题? –

+3

为什么'九月'不是'九月'?是March'Marc'还是你有月份的完整列表? – RichardTheKiwi

+0

5月9日的样子是什么? –

回答

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 

欲了解更多信息,请参见:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+0

+1为明确的日期格式! –

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个字符,例如三月,马克,三月,九月,你可以说非常糟糕文本的日期时间使用下面的

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更新语句转换为正常的3个字元月格式。

+0

它只是一个简单的NVARCHAR Datetime。我的变量是nvarchar格式,我需要在表中更新的列是datetime格式。转换代码是我认为这个110。我再次修改了这个问题。请帮忙 ! – user1681514