【问题标题】:Conversion failed when converting my column from string to date将我的列从字符串转换为日期时转换失败
【发布时间】:2019-08-23 10:13:25
【问题描述】:

当我尝试将我的 Exportdatum 列从字符串转换为日期时,我总是收到错误:

从字符串转换日期和/或时间时转换失败。

我的代码:

ALTER TABLE [BLA1]
ALTER COLUMN [Exportdatum] DATE

目前我的 BLA1.Exportdatum 列如下所示:

15.05.2016
24.08.2014
...

【问题讨论】:

  • 将日期转换为date...这是明智之举。
  • 为什么使用 varchar 列来存储日期?我经常想知道是什么让人们这样做

标签: sql-server date type-conversion


【解决方案1】:

dd.MM.yyyy 不是一种明确的格式,因此 SQL Server 无法对其进行转换。您首先需要将值更新为 ISO 格式(我们将在此处使用 yyyyMMdd);

UPDATE dbo.BLA1
SET Exportdatum = CONVERT(varchar(8),CONVERT(date,REPLACE(Exportdatum,'.','/'),103),112);

那么你可以ALTER你的餐桌:

ALTER TABLE dbo.[BLA1] ALTER COLUMN [Exportdatum] date;

这确实假设你所有的日期都是dd.MM.yyyy的格式;如果他们不是,恐怕你会进入一个非常不同的“受伤”世界。尤其是你有像'06.07.08' 这样的日期,因为它可以被解释为许多不同的日期。

【讨论】:

  • 没有第 24 个月,所以你的假设应该是正确的。
  • 我们经常发现的问题(我相信你很清楚@TimBiegeleisen)是,一旦有人开始让他们的用户输入日期作为字符串,他们(用户)就会使用任何他们当时感觉的格式。我很少看到允许用户将日期输入为字符串的系统,该系统强制输入格式。一旦您拥有一个允许日期字符串且没有强制格式的系统,该数据的所有含义就会完全丢失。 当然,将日期存储为字符串甚至强制格式字符串的系统仍然是错误的。
  • 非常感谢!是的,我的日期都是 dd.MM.yyyy 格式;
【解决方案2】:

我认为 SQL Server 内部无法识别这种日期格式。但是,我们可以尝试使用 TRY_CONVERT 和一些字符串操作:

WITH BLA1 AS (
    SELECT '15.05.2016' AS Exportdatum UNION ALL
    SELECT '24.08.2014'
)

SELECT
    Exportdatum,
    TRY_CONVERT(datetime, RIGHT(Exportdatum, 4) +
                          SUBSTRING(Exportdatum, 4, 2) +
                          LEFT(Exportdatum, 2)) AS Exportdatum_out
FROM BLA1;

Demo

这里的策略是将文本日期转换为YYYYmmdd 格式,然后使用SQL Server 的TRY_CONVERT 处理其余部分。

【讨论】:

    【解决方案3】:

    你可以试试这个。 dd.mm.yyyy 不是 SQL 中默认接受的格式。因此,首先需要将您的值转换为标准日期格式。然后您可以将您的列更改为日期时间类型。

    Create table tt ( val varchar(100) )
    
    insert into tt ( val ) values ( '15.05.2016' )
    
    update tt set val = (RIGHT(val, 4) + '-' + SUBSTRING(val, 4, 2) + '-' + LEFT(val, 2)) 
    
    Alter table tt alter column val datetime
    
    
    
    

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 2013-09-16
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多