关于数据类型的转换问题

nightgoblin 2012-05-02 10:13:29
现在有两张表一张是表类型,一张是公农历对照表:

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');
--创建表类型
GO
IF TYPE_ID('tyWeekday') IS NOT NULL
DROP TYPE tyWeekday;
GO
CREATE TYPE tyHoliday AS TABLE
(Id INT IDENTITY(1,1),
HolidayDate DATETIME);

在SQL Server2008 英文版 和在 SQL Server 2008 SP1 中文简体版 分别运行下面的代码

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类型时处理不一样。
请问下高手这种情况应该怎样处理??

...全文
74 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-05-02
  • 打赏
  • 举报
回复
My sql server was just in SQL2008R2 English version.

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');
--创建表类型
GO
IF TYPE_ID('tyWeekday') IS NOT NULL
DROP TYPE tyWeekday;
GO
CREATE 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;

-- result
Id HolidayDate
----------- -----------------------
1 2013-02-10 00:00:00.000
了解 2012-05-02
  • 打赏
  • 举报
回复
楼主莫急,既然找到问题就好解决。
可用下面的方法转换一下:
语法
使用 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了。

祝福你成功。



nightgoblin 2012-05-02
  • 打赏
  • 举报
回复
感谢各位的回答,我找到解决办法了。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧