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"这种格式的时间字符串保存到数据库里.
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
*/
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
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
*/
年月日时分秒分别用 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
datetime型实际保存的是数字,不是字符。
但是你可以转成你需要的形式。
保存与显示格式是两回事。
set bonu_startdate=convert(datetime,'27/7/2009',103)
where bonu_bonusid=6005
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')