我有一个带有'datetime'的数据源,该数据源是纯文本,在转换它时遇到了问题。 当我尝试将其转换为各种日期格式并将INSERT插入新表时,出现错误。
数据示例:
"18-07-2015 11:50:30am"
源表结构:
CREATE TABLE [dbo].[Conv_COMMUNICATIONEXPORT]([datetime] [varchar](255) NULL)
目标表结构:
CREATE TABLE [dbo].[TB_X_Attachment]([CreatedDate] [datetime] NULL)
插入数据时出错:
Msg 242, Level 16, State 3, Line 4
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
当我运行以下选择时,最后一次转换将返回错误:
SELECT CONVERT(VARCHAR(30), GETDATE(), 120) ,getdate() ,CONVERT(DATE, CONVERT(VARCHAR(40), '01-01-2000'), 120)
当我在表中运行以下命令时,就会成功:
INSERT INTO TB_X_Attachment (CreatedDate)
CONVERT(DATE, CONVERT(VARCHAR(30), '2000-01-01'), 120) AS WORKS
尝试插入时,以下任何转换尝试均无效:
SELECT ce.[datetime] AS VARCHAR_DATETIME,
CONVERT(VARCHAR(10), CE.[datetime], 120),
CONVERT(char(10), CONVERT(VARCHAR(10), CE.[datetime], 120),120),
CONVERT(VARCHAR(10),CONVERT(char(10), CONVERT(VARCHAR(10), CE.[datetime], 120),120),120),
CONVERT(VARCHAR,(CONVERT(VARCHAR(10), CE.[datetime], 120))) ,
CONVERT(VARCHAR(10), CE.[datetime], 120)
FROM Conv_ATTACHMENTEXPORT ae
INNER JOIN Conv_COMMUNICATIONEXPORT ce
ON ae.[attachment record id] = ce.[communication id]
我认为,如果我可以将输出反转为YYYY-MM-DD,则可能有效。所有的转换尝试都不想为此设置格式。如何将输出反转为YYYY-MM-DD?
答案 0 :(得分:1)
在将字符串转换为dateTime
值时,SQL Server非常聪明。
但是,日期和时间值的字符串表示形式非常聪明,这非常棘手-这就是我们拥有ISO 8601标准的原因,该标准保证SQL Server在转换为datetime时始终能够正确解释。
但是,我了解到您对源数据没有任何控制权,因此必须处理指定的格式。
快速浏览Convert
函数文档中的Date and Time Styles表将为您提供以下格式:
Without With Standard Input/Output (3)
century (yy) (1) century (yyyy)
3 103 British/French 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 German 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 Italian 5 = dd-mm-yy
105 = dd-mm-yyyy
Century的三个选项中的任何一个都会为您指定的字符串提供正确的DateTime
值:
DECLARE @DateString varchar(30) = '18-07-2015 1:5:3pm';
SELECT @DateString As string,
CONVERT(DateTime2, @DateString, 103) As [103],
CONVERT(DateTime2, @DateString, 104) As [104],
CONVERT(DateTime2, @DateString, 104) As [105]
结果:
string 103 104 105
18-07-2015 1:5:3pm 2015-07-18 13:05:03 2015-07-18 13:05:03 2015-07-18 13:05:03
由于原始字符串使用连字符作为分隔符,因此我将使用意大利标准(105),因为它与源字符串格式最接近。
答案 1 :(得分:1)
尝试一下:
select convert(datetime, [datetime], 105)
其中[datetime]
是您的varchar列,其中包含要转换的日期
或者简单地
select convert(datetime, '18-07-2015 11:50:30pm', 105)