将 varchar 2007-12-19-11.57.1​​7.366731 转换为 datetime 数据类型

Posted

技术标签:

【中文标题】将 varchar 2007-12-19-11.57.1​​7.366731 转换为 datetime 数据类型【英文标题】:Convert varchar 2007-12-19-11.57.17.366731 to datetime datatype 【发布时间】:2013-04-08 20:49:17 【问题描述】:

我有如下数据

2007-12-19-11.57.17.366731 

数据类型为varchar(26)

我只想将数据类型更改为datetime

我尝试了所有语法但没有用,我得到了

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

这是我正在尝试的示例

SELECT CONVERT(Datetime, '2007-12-19-11.57.17.366731', 120)

谢谢

【问题讨论】:

【参考方案1】:

首先,您需要添加一些字符串魔术来将您的数据转换为DATETIME 接受的格式。而且您还需要使用更少的毫秒数(对于 DATETIME,您有 3 位数字),在 SQL Server 2008 中,您可以为此使用 DATETIME2。请尝试以下操作:

DECLARE @Value VARCHAR(26)
SET @Value = '2007-12-19-11.57.17.366731'

SELECT  CONVERT(DATETIME,LEFT(@Value,10) + ' ' + 
                         REPLACE(SUBSTRING(@Value,12,8),'.',':') + '.' +
                         SUBSTRING(@Value,21,3), 120) ValueAsDatetime,
        CONVERT(DATETIME2,LEFT(@Value,10) + ' ' + 
                         REPLACE(SUBSTRING(@Value,12,8),'.',':') + '.' +
                         RIGHT(@Value,6), 120) ValueAsDatetime2

结果:

╔═════════════════════════╦═════════════════════════════╗
║     ValueAsDatetime     ║      ValueAsDatetime2       ║
╠═════════════════════════╬═════════════════════════════╣
║ 2007-12-19 11:57:17.367 ║ 2007-12-19 11:57:17.3667310 ║
╚═════════════════════════╩═════════════════════════════╝

【讨论】:

非常感谢它有效,但在 100,000 条记录中,我只获得了 75000 条记录。我希望很少有记录的格式不同。在 75000 条记录之后,日期可能是奇怪的格式。所以剩余的记录没有被填充。我希望我认为无论记录是不同格式的记录都写成 NULL 并传递剩余的 75000 条记录。【参考方案2】:

您试图提供不可接受的datetime 格式。这是正确的格式:

SELECT CONVERT(Datetime, '2007-12-19 11:57:17.366', 120)

【讨论】:

【参考方案3】:

查看其他问题:Best way to parse DateTime to SQL server

您必须将“安全”格式传递给 DateTime 函数,这意味着您必须将字符串解析为其组件,然后以正确的格式将其传递给 DateTime

【讨论】:

以上是关于将 varchar 2007-12-19-11.57.1​​7.366731 转换为 datetime 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

将 VARCHAR 转换为 Datetime 并将 VARCHAR 转换为 Decimal 时创建外部表错误

将 Varchar 转换为 NVarchar?

oracle中如何将varchar型转换成int型

将 VARCHAR 转换为 BIGINT

将 Varchar 转换为 Ascii

将文本转换为 varchar