【问题标题】:Error converting dbtype_dbdate to date将 dbtype_dbdate 转换为日期时出错
【发布时间】:2012-07-14 22:09:23
【问题描述】:

我在 MS SQL Server 2012 中将 ODBC 数据源设置为链接服务器。在整个数据库中,数据类型为日期的大多数(但不是全部)列在我运行查询时都会给我带来麻烦。查询这些日期类型列以外的任何列都没有任何问题。

以下查询:

SELECT *
FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                           DateLastReceipt
                                    FROM   ProductTable')

在 SQL Server Management Studio (2012) 中提供以下错误消息:

消息 8114,级别 16,状态 10,第 1 行。将数据类型 DBTYPE_DBDATE 转换为日期时出错。

我已经尝试使用 CONVERT 将数据类型转换为 varchar 根据以下讨论没有任何运气(相同的错误消息):http://social.technet.microsoft.com/Forums/en-US/transactsql/thread/3a7d94ee-46a0-40ce-ae95-127ec462fbff

现在,有一些数据类型(日期)完全相同的列根本不会给我带来任何麻烦。例如,在我的 ProductTable 中有一个名为 AdditionalToFile 的列,它显示了记录的创建日期。这个专栏完全没有给我带来麻烦。

如果有人能提供任何帮助,我们将不胜感激。

谢谢。

【问题讨论】:

    标签: sql database odbc sql-server-2012


    【解决方案1】:

    希望这会有所帮助(我没有使用 SQL Server 2012)。
    如果您的 ODBC 链接到 db2,则日期范围不受支持,例如'0001-01-01',你需要投射。 通常这是有效的。

    SELECT * 
    FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                           CAST(DateLastReceipt AS CHAR(10))
                                    FROM   ProductTable')
    

    如果您仍然希望结果为日期,只需使用 CASE 并将无效日期替换为您的默认日期。例如

    SELECT *
    FROM   OPENQUERY(LINKEDSERVERNAME, 'SELECT Product, 
                                   ,CASE WHEN DateLastReceipt AS CHAR(10)) = ''0001-01-01''
                                           THEN CURRENT_DATE
                                         ELSE DateLastReceipt 
                                         END
                                    FROM   ProductTable')
    

    您可能需要将 CURRENT_DATE 更改为 CURRENT_TIMESTAMP,CASE 组合取决于您的数据库服务器和您的要求

    【讨论】:

    • 谢谢@lamLam。您的第一个建议查询为我引发了以下错误:链接服务器“LINKEDSERVERNAME”的 OLE DB 提供程序“MSDASQL”返回了消息“[Transoft][TSODBC][usqlsd]'FROM' expected here (()”。使用第二个查询,我收到以下错误:链接服务器“LINKEDSERVERNAME”的 OLE DB 提供程序“MSDASQL”返回消息“[Transoft][TSODBC][usqlsd]Name expected (,)”。我的语法是否与这两个有关?这些不似乎是最具描述性的错误消息。感谢您的帮助。我是新手。
    • 对不起,我以前从未使用过 Transoft 的东西。您可以尝试...直接使用 Transoft 客户端(如果有)运行 select 语句,或者直接运行到服务器 SELECT Product, CAST(DateLastReceipt AS CHAR(10)) FROM ProductTable。搜索有关将日期转换为字符的 Transoft sql 手册。可能 Transoft 不支持 CAST,或者使用 CHARACTER(10) 代替 CHAR,或者它使用不同的函数。一旦工作,只需将整个内容复制回 SQL Server 脚本
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 2020-09-07
    • 2023-03-29
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多