首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于数据类型的转换有关问题

2012-05-03 
关于数据类型的转换问题现在有两张表一张是表类型,一张是公农历对照表:SQL codeIF OBJECT_ID(CalendarRef

关于数据类型的转换问题
现在有两张表一张是表类型,一张是公农历对照表:

SQL code
IF OBJECT_ID('CalendarReference') IS NOT NULL DROP TABLE CalendarReference;GO--日历对照表(公历农历对照表)CREATE TABLE CalendarReference( Id INT IDENTITY (1,1) NOT NULL ,  CalendarDate DATETIME NOT NULL ,  LunarDate DATETIME NOT NULL  );--插入数据INSERT INTO CalendarReference VALUES ('20130210','20130101');--创建表类型GOIF TYPE_ID('tyWeekday') IS NOT NULLDROP TYPE tyWeekday;GOCREATE TYPE tyHoliday AS TABLE (Id INT IDENTITY(1,1), HolidayDate DATETIME); 

在SQL Server2008 英文版 和在 SQL Server 2008 SP1 中文简体版 分别运行下面的代码
SQL code
declare @d char(10),        @tyh AS tyHoliday;select @d=CalendarDate from CalendarReference where LunarDate='20130101';select @d;INSERT INTO @tyh  VALUES (@d);SELECT * FROM @tyh;

在SQL Server2008 英文版里会报错:
Msg 242, Level 16, State 3, Line 5
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
但是在SQL Server 2008 SP1 中文简体版 里不报错。
通过调试我发现在SQL Server2008 英文版里 @d的值为:Feb 10 201, 所以插入到@tyh会报错,
但是在SQL Server 2008 SP1 中文简体版里@d的值为:02 10 2013,插入时没报错。
这都是因为时间类型转换为CHAR类型时处理不一样。
请问下高手这种情况应该怎样处理??



[解决办法]
楼主莫急,既然找到问题就好解决。
可用下面的方法转换一下:
语法
使用 CAST:

CAST ( expression AS data_type ) 

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

--例子
-- Use CAST.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
GO

-- Use CONVERT.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
GO

这样就行了吗,你参考这个改一下你的代码就ok了。

祝福你成功。




[解决办法]
My sql server was just in SQL2008R2 English version.
SQL code
IF OBJECT_ID('CalendarReference') IS NOT NULL DROP TABLE CalendarReference;GO--日历对照表(公历农历对照表)CREATE TABLE CalendarReference( Id INT IDENTITY (1,1) NOT NULL ,  CalendarDate DATETIME NOT NULL ,  LunarDate DATETIME NOT NULL  );--插入数据INSERT INTO CalendarReference VALUES ('20130210','20130101');--创建表类型GOIF TYPE_ID('tyWeekday') IS NOT NULLDROP TYPE tyWeekday;GOCREATE TYPE tyHoliday AS TABLE (Id INT IDENTITY(1,1), HolidayDate DATETIME); declare @d char(10),        @tyh AS tyHoliday;select @d=convert(varchar(30),CalendarDate,120) from CalendarReference where LunarDate='20130101';INSERT INTO @tyh  VALUES (@d);SELECT * FROM @tyh;-- resultId          HolidayDate----------- -----------------------1           2013-02-10 00:00:00.000 

热点排行