文字日期转换问题

时间:2019-07-16 06:07:50

标签: sql-server tsql datetime casting

我有一个带有'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] 

请参见下面的上述转换尝试结果的图片 last column is format that will insert

我认为,如果我可以将输出反转为YYYY-MM-DD,则可能有效。所有的转换尝试都不想为此设置格式。如何将输出反转为YYYY-MM-DD?

2 个答案:

答案 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)