update bonus 
set bonu_startdate=convert(datetime,'7/27/2009') 
where bonu_bonusid=6005
如果按照上面的方法保存时,能正确update. 这种字符串的格式为"mm/dd/yyyy"但按照这种格式保存时,就报错误:"从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界"update bonus 
set bonu_startdate=convert(datetime,'27/7/2009') 
where bonu_bonusid=6005
这种字符串的格式为"dd/mm/yyyy"就不能update下来了.奇怪?现在我的问题是:能不能把"dd/mm/yyyy"这种格式的时间字符串保存到数据库里.

解决方案 »

  1.   

    --你这样存不同格式很混乱。
    SET DATEFORMAT DMY
    DECLARE @TB TABLE(COL DATETIME)
    INSERT @TB VALUES('27/7/2009')SELECT * FROM @TB
    /*
    COL
    -----------------------
    2009-07-27 00:00:00.000
    */
      

  2.   

    能不能用update去完成"mm/dd/yyyy"?谢谢.
      

  3.   


    create  TABLE TB(COL DATETIME)
    insert into TB select getdate()
    select * from tB
    /*
    COL                                                    
    ------------------------------------------------------ 
    2009-07-09 12:46:32.233(所影响的行数为 1 行)
    */
    insert into TB select '27/7/2009'
    /*
    服务器: 消息 242,级别 16,状态 3,行 1
    从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
    语句已终止。*/--所以,要和之前插入的数据格式一致
    drop table TB
      

  4.   

    SET DATEFORMAT DMY
    DECLARE @TB TABLE(COL DATETIME)
    INSERT @TB VALUES('27/7/2009')UPDATE @TB SET COL='28/7/2009'SELECT * FROM @TB
    /*
    COL
    -----------------------
    2009-07-28 00:00:00.000
    */
      

  5.   

    可以自己写一个函数进行此类转换,模拟oracle的转换方法,一劳永逸。我一会写一个
      

  6.   

    先来个简单版,创建如下函数,用法为 select dbo.F_CharToDate('07/27/2009','mm/dd/yyyy')
    年月日时分秒分别用 yyyy mm dd hh mi ss 表示这个版本的问题是你需要用0补全输入字符串中的信息,比如7月需要输入07。大家继续发挥
    create     function [dbo].[F_CharToDate](
      @arg_date varchar(50),
      @arg_format varchar(50) 
    )
    /***************************************************
    * author Felix
    * 功能:将字符串时间,按照格式转换为时间类型
    * @arg_date 输入的字符串时间
    * @arg_format 输入的格式
    **************************************************/
    returns datetime
    as
    begin
      declare @v_return datetime
      declare @v_year varchar(10)
      declare @v_month varchar(10)
      declare @v_day varchar(10)
      declare @v_hour varchar(10)
      declare @v_minute varchar(10)
      declare @v_second varchar(10)
      declare @v_millisecond varchar(10)
      declare @v_date datetime
      declare @v_format varchar(50)
        
      set @v_format = isnull(@arg_format,'yyyy-mm-dd hh:mi:ss')  set @v_year = substring(@arg_date,charindex('yyyy',@arg_format),4)
      set @v_month = substring(@arg_date,charindex('mm',@arg_format),2)
      set @v_day = substring(@arg_date,charindex('dd',@arg_format),2)
      set @v_hour = substring(@arg_date,charindex('hh',@arg_format),2)
      set @v_minute = substring(@arg_date,charindex('mi',@arg_format),2)
      set @v_second = substring(@arg_date,charindex('ss',@arg_format),2)
      
      -- 进行替换
      set @v_return = cast(@v_year + '-' + @v_month + '-' + @v_day
    + ' ' + @v_hour + ':' + @v_minute 
    + ':' + @v_second as datetime)
    return @v_return
    end
      

  7.   

    楼主用字符型保存不就行了吗!
    datetime型实际保存的是数字,不是字符。
    但是你可以转成你需要的形式。
    保存与显示格式是两回事。
      

  8.   

    Try:update bonus 
    set bonu_startdate=convert(datetime,'27/7/2009',103) 
    where bonu_bonusid=6005
      

  9.   

    自己写的方法灵活些,可以扩展处理各种诡异情况,这样的都可以转化成dattime,不过上面方法还不太完善,有些小bug:
    20090727010203
    2009*07*27----18:00
    27/hehe/07/haha/2009select dbo.F_CharToDate('20090727','yyyymmddhhmiss') 
    select dbo.F_CharToDate('2009*07*27-18:00','yyyy*mm*dd-hh:mi') 
    select dbo.F_CharToDate('27/hehe/07/haha/2009','dd/hehe/mm/haha/yyyy') 
      

  10.   

     这是数据库字段的类型限制,字段的类型为DATETIME时,且使用中文SQL时,此字段的格式必须为“YYYY-MM-DD”,如要使用“MM-DD-YYYY”只能用字符型或用英文版SQL。