`

[转]关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法

    博客分类:
  • SQL
阅读更多
转自:http://blog.csdn.net/derryzhang/archive/2009/06/29/4306071.aspx

最近收到玻利维亚客户的反馈,运行程序时总提示:
2147217913:La conversión del tipo de datos char a datetime produjo un valor datetime fuera de intervalo.

其英文意思是:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

中文的意思是:
从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。

执行的SQL语句类似:
INSERT INTO Table1(EventType,EventTime)
VALUES('Abnormal error','2008-04-18 11:14:00')

客户的运行环境为:window2000 SP4+ sql200

以上sql 在自己机器上运行,没有任何错误。

根据错误提示,可以初步判断是 SQL 在转换'2008-04-18 11:14:00'时出的问题。我就想 是不是 客户那边操作系统的区域设置的日期格式没设好,导致问题产生的。

我让用户发回了他的区域设置的相关信息:
Time Tab中 Time format 为: hh:mm:ss tt
Date Tab中 Short date format 为: yyyy-MM-dd
Date Tab中 Long date format 为: dddd,dd' de 'MMMM' de 'yyyy

然后我对照我的系统的设置,让用户改成:
Time Tab中 Time format 为: hh:mm:ss
Date Tab中 Short date format 为: yyyy-MM-dd
Date Tab中 Long date format 为: yyyy-MM-dd

用户重新启动计算机后,问题依旧。

马上到网上 google, 没能找到真正能剖析出问题根源的,得到一些线索 SET DATEFORMAT,
查sql 帮助,其作用是:设置用于输入 datetime 或 smalldatetime 数据的日期部分(月/日/年)的顺序。
有效参数包括 mdy、dmy、ymd、ydm、myd 和 dym。美国英语默认值是 mdy。

到此,我明白了 ,客户的SQL Server在转换'2008-04-18 11:14:00'时没有使用 ydm,而是使用了别的格式。

某些网友的答案就是在执行,
INSERT INTO Table1(EventType,EventTime)
VALUES('Abnormal error','2008-04-18 11:14:00')
之前 ,加上 SET DATEFORMAT ymd

但是提供给客户的程序是在很多个国家运行了很久的,没有发生过这种问题,是经历过考验的,而且源代码中 很多地方都是使用“yyyy-mm-dd hh:mm:ss” 这种格式来格式化长日期时间,要在每个地方都加上SET DATEFORMAT ymd 不是最好的解决办法,而且sql文档上已经说明SET DATEFORMAT 只能影响当前会话的转换。因此这种方法对我来说不可取。

那怎么样才能不改程序而能让SQL Sever 能够按 ymd 解释我提供的日期呢? google了又google 还是没找到办法,休息去了。

第二天,又google ,发现了一些线索:
SELECT @@LANGUAGE    --返回当前使用的语言名
SET LANGUAGE        --设置当前会话的语言,会影响DATEFORMAT
DBCC USEROPTIONS --返回当前连接的活动(设置)的 SET 选项。
sp_configure            --显示或更改当前服务器的全局配置设置
sp_helplanguage     --报告有关某个特定的备用语言或所有语言的信息。相当于select * from master..syslanguages

我在我的机器上打开sql 查询分析器,执行 SELECT @@LANGUAGE ,返回结果是 简体中文,而且每次打开sql 查询分析器,其结果都是简体中文。 执行 sp_helplanguage ,知道SQL 简体中文 语言的日期格式为 ymd, 因此在我机器上执行
INSERT INTO Table1(EventType,EventTime)
VALUES('Abnormal error','2008-04-18 11:14:00')
能成功,当我 把语句改成
INSERT INTO Table1(EventType,EventTime)
VALUES('Abnormal error','18-04-2008 11:14:00')
这时就有问题了,
    服务器: 消息 242,级别 16,状态 3,行 1
    从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
    语句已终止。
也就是跟开头 客户遇到的问题一样了。

好了,到此更进一步说明了是SET DATEFORMAT 影响了对字符串日期的正确处理。 而SET LANGUAGE 会联动SET DATEFORMAT 。只要我能 SET LANGUAGE  成正确的语言,那么我的字符串日期就能正确处理。

前面提到,每次我登录sql 查询分析器,执行 SELECT @@LANGUAGE ,返回结果都是 简体中文,我用 sql 的事件探查器分析,每次我登录sql 查询分析器,都有这段显示
-- network protocol: LPC
set quoted_identifier on
set implicit_transactions off
set cursor_close_on_commit off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set language 简体中文        --这里就是关键
set dateformat ymd            --
set datefirst 7

为什么会这样,从哪里设置才能够在登录时使用我想用的语言呢(其实答案很简单,只是现在我还没弄明白)?

后来试着修改操作系统的区域设置里的国家 为 English,重新启动, SELECT @@LANGUAGE ,返回结果还是简体中文,说明这条路走不同,也说明改操作系统的区域设置里的国家,对连接sql server的默认语言没有影响。

后来试着在企业管理器中,修改数据库的 SQL Server 属性--> 服务器设置-->默认语言 设为 English,重新启动,结果还是返回简体中文。为什么这样啊? 写到这里,我就要批评一下 sql 2000了,在SQL Server 属性--> 服务器设置-->默认语言 中,没有任何的说明,我就认为 通过设置这个选项,sql server 就按我设置的语言进行内部处理。其实改选项的作用不是我所理解,它的作用实际上是:新建用户时,默认语言如果使用defult ,那么其默认语言 等于 SQL Server 属性--> 服务器设置-->默认语言的设置值(该选项在 sql 2005中就有比较好的说明)。注意修改该选项不会对已有登记的用户有影响,只对新登记用户有影响。

到这里终于 云开雾散, 从哪里设置才能够在登录时使用我想用的语言呢,其实就是修改一下 登录用户的默认语言,就这么简单。
打开企业管理器-->你注册的SQL server-->安全性 -->登录,双击你所用的登录用户,弹出 sql server 登录属性,修改默认设置 中的语言。

我让用户把他的sql登录用户的默认语言改成 English, 问题解决。(原先设的是 spanish)

备注:
语言= English,  其DATEFORMAT 为 mdy, 但是它也能正确转换格式为“yyyy-mm-dd hh:mm:ss” 的字符串日期。

关键字:
SQL Server ,2147217913 ,

线索:
SET LANGUAGE
SET DATEFORMAT
SELECT @@LANGUAGE
DBCC USEROPTIONS
sp_configure
sp_helplanguage

http://technet.microsoft.com/zh-cn/library/ms174398.aspx
http://technet.microsoft.com/zh-cn/library/ms187357.aspx
http://technet.microsoft.com/zh-cn/library/ms190303.aspx
分享到:
评论

相关推荐

    c#数据类型转换,BYTE,float,double,char类型间的转换方法.docx

    要注意的是,从较大类型转换到较小类型可能会导致数据丢失,因此需要谨慎处理。 **字符(char)的ASCII码和Unicode码** 在C#中,`char`类型是16位的Unicode字符。可以使用`Convert.ToInt32()`或`int.Parse()`函数将...

    mysql数据类型转换

    `CONVERT`函数也是实现数据类型转换的一个常用方法,特别是在处理字符类型到数字类型的转换时。 ```sql -- 示例:将字符串'123'转换为整型 SELECT CONVERT('123', SIGNED); ``` #### 五、总结:类型转换语法与...

    c#数据类型转换,BYTE,float,double,char类型间的转换方法 (3).docx

    本文将详细讨论C#中的数据类型转换,包括BYTE、float、double和char之间的转换方法。 1. 装箱与拆箱: 装箱是将值类型(如int、char)转换为对应的引用类型(如System.Int32、System.Char)的过程,而拆箱则是相反...

    python中时间转换datetime和pd.to_datetime详析

    本文将深入探讨两种常用的时间转换方法:`datetime` 和 `pd.to_datetime`。这两种方法都是为了将不同格式的时间数据转换成标准的日期时间对象,以便进行进一步的操作。 首先,我们来看`datetime` 模块。`datetime` ...

    数据库技术sql数据类型转换

    ### 数据库技术:SQL数据类型转换 在数据库管理和查询操作中,经常需要对不同数据类型进行转换以满足特定的需求或实现特定的功能。SQL Server 提供了两种常用的数据类型转换方式:`CAST()` 和 `CONVERT()` 函数。这...

    SQL的datetime类型数据转换为字符串格式大全

    SQL的datetime类型数据转换为字符串格式大全 2007-10-10 11:11:43 2007/10/10 SELECT convert(char(20),getdate(),120) as TIME_1,convert(char(20),getdate(),111) as TIME_2 将字符串20100426103059转换为...

    SQL数据类型与C#数据类型转换

    ### SQL数据类型与C#数据类型的转换 在开发过程中,我们经常会遇到需要将数据库中的数据类型映射到编程语言中的情况。特别是在使用SQL Server作为后端数据库与C#进行交互时,了解这两种环境下的数据类型及其对应...

    时间字符串转换成日期对象datetime的方法

    您可能感兴趣的文章:sql语句中如何将datetime格式的日期转换为yy-mm-dd格式将WMI中的DateTime类型转换成VBS时间的函数代码LINQ字符串向datetime 转换时失败的处理方法Sql中将datetime转换成字符串的

    TypeByte@2019_C#_C++_C数据类型转换时间戳转换_

    本项目"TypeByte@2019_C#_C++_C数据类型转换时间戳转换_"显然是针对C#、C++和C这三种编程语言,提供了一种解决方案来实现数据类型的互转以及时间戳的转换。 首先,让我们深入探讨一下C#中的数据类型转换。C#是一门...

    winform dateTime数据类型转换方法

    在本文中,我们将深入探讨如何在Winform应用中进行`DateTime`数据类型的转换,并解决在转换过程中可能遇到的问题。 在数据库中,日期字段通常以特定格式存储,如"2013-03-03 00:00:00"。在从数据库读取这些值并将其...

    datetime时间格式转换大全

    了解这些转换方法和格式代码后,我们就能更灵活地处理 `DateTime` 类型的数据,满足各种需求,无论是显示在用户界面、写入日志、还是与其他系统交换数据。正确地转换日期时间格式是开发过程中的重要一环,确保数据的...

    DateTime数据类型

    在SQL Server中,`DateTime`是一种常用的数据类型,用于存储日期和时间值。它能精确到毫秒级别,并且支持广泛的日期范围。 #### 二、DateTime数据类型的基本属性 ##### 1. 存储范围 - **日期范围**:`DateTime`...

    C#各种数据类型转换

    ### C#中的各种数据类型转换方法 在C#编程中,数据类型的转换是十分常见的操作。无论是基本数据类型的转换还是复杂对象之间的转换,都非常重要。本文将详细介绍C#中涉及的一些常见数据类型转换方法,包括但不限于...

    将c#的DateTime类转成java

    `DateTime`是C#中用于表示日期和时间的内置类型,而在Java中,相应的类型是`java.util.Date`和`java.time`包下的类,如`LocalDate`, `LocalTime`和`LocalDateTime`等。 C#的`DateTime`类提供了一系列方法和属性来...

    java的Date类型转换成MySQL的DateTime类型.docx

    为了实现从Java的`Date`类型到MySQL的`DateTime`类型的转换,可以采用以下步骤: 1. **创建转换方法**:定义一个名为`DateToMySQLDateTimeString`的方法,该方法接受一个`java.util.Date`对象作为参数,并返回符合...

    Android的SQLite中DateTime类型数据的存取问题

    Android 的 SQLite 中 DateTime 类型数据的存取问题 Android 平台中的 SQLite 数据库在存储 DateTime 类型的数据时会遇到...本文详细介绍了 Android 的 SQLite 中 DateTime 类型数据的存取问题,并提供了解决方法。

    通用int, dateTime, Double的数据类型转换四舍五入

    通用的数据类型转换。解析double,int, datetime数据类型,不能解析返回 null,还有四舍五入方法

    python timestamp和datetime之间转换详解

    本文详细介绍了 Python 中 Timestamp 和 Datetime 之间的转换方法,通过具体的代码示例,帮助开发者更好地理解和掌握时间处理的相关技术。在实际开发中,灵活运用这些转换技巧可以大大提高工作效率,减少因时间处理...

Global site tag (gtag.js) - Google Analytics