我有一个值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.谢谢!
答案 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
有关详细信息,请参阅: