首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒号(:)和点(.)在datetime2中作为毫秒分离器

冒号(:)和点(.)在datetime2中作为毫秒分离器
EN

Stack Overflow用户
提问于 2018-05-05 08:16:50
回答 3查看 587关注 0票数 0

我已经将Sybase数据库迁移到SQL server 2008。使用数据库尝试使用dateTime2列设置某些数据(如1986-12-24 16:56:57:81000 )的主要应用程序是这样做的:

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

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

注:

我无法访问应用程序的源代码来解决这个问题,而且有很多表都有相同的问题。

  1. 应用程序使用ODBC连接连接到数据库。

是否有任何快速转发解决方案,或者应该在所有表上编写大量触发器来使用上述解决方案来修复它?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-05 23:01:04

正如戈登·林诺夫所说

当前表上的触发器不会有帮助,因为类型转换发生在调用触发器之前。想想触发器是如何工作的:数据在"protorow“中可用。

但是有一个简单的答案!

使用SQL Server Native Client Connection而不是基本的SQL Server ODBC connection来处理所有事情。

注意:

  1. 由于我使用的是Server 2008,本机客户端的第10版工作正常,但版本11 (适用于server 2012)。
  2. Use Regional Settings产生了一些其他的转换问题,所以如果您不需要它,就不会使用它。
票数 2
EN

Stack Overflow用户

发布于 2018-05-05 10:50:27

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

代码语言:javascript
复制
update t
    set col = stuff(col, 20, 1, '.');

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

编辑:

我想我误解了这个问题(假设数据已经在表中)。将数据放到暂存表中,并在另一步中进行转换。

当前表上的触发器不会有帮助,因为类型转换发生在调用触发器之前。想想触发器是如何工作的:数据在"protorow“中可用。

您可以通过创建视图和在视图上构建触发器来获得触发器,但这甚至更糟。也许最简单的解决办法是:

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

Stack Overflow用户

发布于 2018-05-05 12:02:32

选择替换(getdate(),':','.')

但是它会将String提供给datetime,而它不会被隐藏到DateTime Formate中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50187277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档