冒号(:)和点(。)作为datetime2中的毫秒分隔符

时间:2018-05-05 08:16:50

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

我已将Sybase数据库迁移到 SQL server 2008 。 使用数据库尝试使用1986-12-24 16:56:57:81000之类的数据设置某些dateTime2列的主要应用程序,它会产生此错误:

  

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

使用点(。)代替冒号(:)作为毫秒分隔符(如1986-12-24 16:56:57.81000)或将毫秒限制为3位数字(如1986-12-24 16:56:57:810)运行相同的查询将解决问题。

注意:
1-我无权访问应用程序来解决此问题,并且有很多表存在同样的问题 2.应用程序使用ODBC连接连接到数据库。

是否有快速转发解决方案,或者我应该在所有表格上编写大量触发器来使用上述解决方案进行修复? 提前致谢

3 个答案:

答案 0 :(得分:2)

AS Gordon Linoff说道。

  

当前表上的触发器不会有帮助,因为类型   转换在调用触发器之前发生。想想怎么样   触发器有效:数据以“protorow”形式提供。

但是有一个简单的答案! 使用 SQL Server Native Client Connection 代替基本SQL Server ODBC connection处理所有内容。

注意:
1.因为我使用SQL Server 2008版本10的SQL服务器本机客户端工作正常但不是版本11(它适用于SQL Server 2012)。
2. Use Regional Settings进行其他转换问题,以便使用它。如果您不需要它。

答案 1 :(得分:0)

为什么需要触发器?您可以使用update将最后':'更改为'.'

update t
    set col = stuff(col, 20, 1, '.');

您还错误地将该列描述为datetime2。它使用内部日期/时间格式。你的专栏显然是一个字符串。

编辑:

我想我误解了这个问题(假设数据已经在表格中)。将数据导入临时表并在另一步骤中执行转换。

当前表上的触发器没有帮助,因为类型转换在调用触发器之前发生。想想触发器的工作原理:数据以“protorow”形式提供。

可以通过在视图上创建视图和构建触发器来获得触发器,但情况更糟。也许最简单的解决方案是:

  • 更改列的名称和数据类型,使其包含字符串。
  • 添加一个计算列,将值转换为datetime2

答案 2 :(得分:0)

选择REPLACE(getdate(),':','。')

但它会将String Formate提供给datetime,而不是隐藏在DateTime formate