【问题标题】:CONVERT throw Error converting data type date to varcharCONVERT throw 将数据类型日期转换为 varchar 时出错
【发布时间】:2017-07-19 07:49:22
【问题描述】:

我有一个表 INTEG_LOG,其中包含一个日期列 DATE_LOG。从那个日期开始,我需要以20171907 格式提取日期和094225 之类的小时。

首先,我试图找到我的约会对象。为此,我使用这一行:

SELECT
    REPLACE(CONVERT(VARCHAR(10), DATE_LOG, 111), '/', '') AS LOG_DATE
FROM
    INTEG_LOG

它不是很干净,但它工作正常。

我决定用这条线在这个小时内做同样的事情:

SELECT
    REPLACE(CONVERT(VARCHAR(8), DATE_LOG, 108), ':', '') AS LOG_HOUR
FROM
    INTEG_LOG

但是这个 SQL 抛出了

将数据类型日期转换为 varchar 时出错

我什至尝试不使用替换,但仍然遇到同样的错误。

我真的不明白为什么第一个转换样式为 111 的转换工作正常,但不是 108。

我使用的是 SQL Server 2008 R2。

谢谢

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?那列DATE_LOG 是什么数据类型?你说这是一个“日期”列 - 但如果它真的是数据类型DATE,那将不包含任何时间部分.....
  • 对我来说——使用 SQL Server 2014 和 DATETIME2(3)(甚至是 DATETIME)数据类型列——这段代码工作得很好
  • 感谢您的回答,我添加了sql server的版本。当我检查我的专栏时,这是一个日期。我已经用 GETDATE() 尝试了这些请求,并且成功了。你是对的,当我将我的专栏更改为日期时间时,它起作用了。谢谢
  • @nebra 怎么可能是日期 20171917?我猜一个月不能超过 12 个月。
  • @ЕвгенийКондратенко 这是一个错字,我想说'20171907'

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

我有一个表 INTEG_LOG,其中包含 date 列 DATE_LOG

您遇到的错误是合法的,因为 date 类型没有时间组件,因此您无法使用样式 108 将其转换为字符串

试试这个

select REPLACE(CONVERT(VARCHAR(100), CAST(getdate() AS DATE), 108), ':', '')

你会得到同样的错误。

所以你应该像这样选择一个常量:

select '000000' AS LOG_HOUR

或者将您的日期转换为日期时间,您将使用您的代码获得相同的结果:

SELECT
    REPLACE(CONVERT(VARCHAR(8), cast(DATE_LOG as datetime), 108), ':', '') AS LOG_HOUR
FROM
    INTEG_LOG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多