【问题标题】:T SQL Conversion failed when converting date and/or time from character string from VARCHAR(MAX)从 VARCHAR(MAX) 的字符串转换日期和/或时间时,T SQL 转换失败
【发布时间】:2020-04-15 11:07:42
【问题描述】:

我使用的是 SQL Server 2014。我有一个日期存储为 varchar(MAX),格式为:

2019-02-18

但是,我想要英国格式 dd/mm/yyyy (103)。

这是我的 SQL:

SELECT CONVERT(DATE, DateField, 103) AS "JobStartDate"
FROM tblTest

但是,我不断收到此错误:

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

我错过了什么?

更新:日期最初存储为 varchar max,因为它来自第 3 方系统。我无法控制这一点,我完全理解这是错误的格式,但这是我得到的。

【问题讨论】:

  • select CONVERT(VARCHAR(10), cast(DateField as date), 103) AS "JobStartDate" from tblTest, docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 你为什么要将日期存储为varchar,以及为什么你“需要”2GB的字符来存储日期?此外,yyyy-MM-dd 格式与 date 数据类型是明确的。但是,您提供的样式代码的格式为 `dd/MM/yyyy;因为这就是它失败的原因。修正你的数据类型,修正问题。
  • 请检查您的数据。该代码将用于将 nvarchar 转换为日期时间。也许您至少有一条日期时间格式的记录
  • @MahdiRahimi 当 OP 告诉 SQL Server 日期格式为 dd/MM/yyyy 时,它将不起作用。 '2019-02-18' 的格式是yyyy-MM-dd,所以当然会失败。
  • @MahdiRahimi '10/10/2012' 的格式为 dd/MM/yyyyMM/dd/yyyy(不可能知道)不是 yyyy-MM-dd。这是不一样的。试试 OP 有什么,SELECT CONVERT(DATE, '2019-02-18', 103) AS "JobStartDate";你会看到它不起作用

标签: sql-server tsql date type-conversion


【解决方案1】:

我有一个日期存储为varchar(MAX)

你的问题就在那里。
您不仅使用了错误的数据类型来存储日期,而且还使用了max,这是一个已知的性能杀手。

问题的解决方案是更改表格并将日期存储在 Date 数据类型中 - 但首先,您必须查找依赖于该列的所有对象并确保它们也不会破坏或改变它们。

假设这不能完成,或者作为临时解决方法,您必须首先将您拥有的数据转换为Date,然后使用103 样式将其转换回该日期的字符串表示形式以获得dd/mm/yyyy.
由于yyyy-mm-dd 字符串格式不依赖于日期数据类型的文化,您可以简单地这样做:

SELECT CONVERT(char(10), TRY_CAST(DateField As Date), 103) As [JobStartDate]
FROM tblTest

请注意,我使用的是 try_cast 而不是 cast,因为数据库无法阻止您在该列中存储无法转换为日期的值。

【讨论】:

    【解决方案2】:

    您希望格式化 DateField 列而不是将其转换为日期。
    所以先转换成DATE再应用格式:

    SELECT FORMAT(CONVERT(DATE, DateField, 21), 'dd/MM/yyyy') AS JobStartDate
    

    请参阅demo

    【讨论】:

    • 如果可能,请使用convert - 此字符串表示格式的转换样式为 103。
    • @forpas 我试过但仍然收到相同的消息
    • @Michael 检查这个:dbfiddle.uk/… 你可以看到代码有效。所以你的数据可能有问题。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多