对于字符串向smalldatetime转换失败问题的解决
2008-09-21 12:25
531 查看
此类问题一般出现于动态存储过程,我以up_selectTradeInfo为例简单说明该问题的解决方法
--建表--银行卡表GOUSE BankCardManageDBGOIF EXISTS (SELECT * FROM sys.objects WHERE NAME='BankCard') DROP TABLE BankCardCREATE TABLE BankCard ( ID int identity(1,1), CardID char(10) PRIMARY KEY, BankName varchar(20) NOT NULL, UserName varchar(20) NOT NULL, Deposit money NOT NULL DEFAULT(0), Payout money NOT NULL DEFAULT(0))GO
--交易记录表USE BankCardManageDBIF EXISTS(SELECT * FROM sys.objects WHERE NAME='Trade') DROP TABLE TradeCREATE TABLE Trade ( TradeID BIGINT PRIMARY KEY IDENTITY(1,1), CardID CHAR(10) FOREIGN KEY REFERENCES BankCard(CardID) NOT NULL, TradeDate DATETIME NOT NULL, TradeMoney MONEY CHECK(TradeMoney>0), TradeType char(8) CHECK(TradeType='存钱' or TradeType='取钱'))GO
--插入测试数据INSERT INTO BankCard VALUES('123456766','工商银行','田国兴',2000,200)INSERT INTO Trade VALUES('123456766','20080921',30000,'存钱')
--创建存储过程 up_selectTradeInfo 查询时间段内卡的交易信息
USE BankCardManageDB
GOIF EXISTS(SELECT * FROM sys.objects WHERE name='up_selectTradeInfo') DROP PROCEDURE up_selectTradeInfoGOCREATE PROCEDURE up_selectTradeInfo @cardID varchar(10), @startDate smalldatetime,--时间上限 @endDate smalldatetime --时间下限AS BEGIN DECLARE @sqlStr varchar(300) SET @sqlStr='SELECT * FROM Trade WHERE CardID='+str(@cardID) +' AND TradeDate BETWEEN '+@startDate+' AND '+@endDate EXEC(@sqlStr) END
exec up_selectTradeInfo '123456766','20080920','20080921'
在执行存储过程时,发生以下错误消息 295,级别 16,状态 3,过程 up_selectTradeInfo,第 11 行将字符串转换为 smalldatetime 数据类型时失败。
具体解决办法如下:把存储过程里面的SET @sqlStr一句改为(嵌套转换)SET @sqlStr='SELECT * FROM Trade WHERE CardID='+str(@cardID) +' AND TradeDate BETWEEN CONVERT(SMALLDATETIME,'+''''+CONVERT(VARCHAR,@startDate,112)+''''+',120)' +' AND CONVERT(SMALLDATETIME,'+''''+CONVERT(VARCHAR,@endDate,112)+''''+',120)'(注意:在数据类型为datetime时最好不要使用那个BETWEEN)再执行exec up_selectTradeInfo '123456766','20080920','20080921'返回TradeID CardID TradeDate TradeMoney TradeType-------------------- ---------- ----------------------- --------------------- ---------18 123456766 2008-09-21 00:00:00 30000.00 存钱
(1 行受影响)问题解决!!
--建表--银行卡表GOUSE BankCardManageDBGOIF EXISTS (SELECT * FROM sys.objects WHERE NAME='BankCard') DROP TABLE BankCardCREATE TABLE BankCard ( ID int identity(1,1), CardID char(10) PRIMARY KEY, BankName varchar(20) NOT NULL, UserName varchar(20) NOT NULL, Deposit money NOT NULL DEFAULT(0), Payout money NOT NULL DEFAULT(0))GO
--交易记录表USE BankCardManageDBIF EXISTS(SELECT * FROM sys.objects WHERE NAME='Trade') DROP TABLE TradeCREATE TABLE Trade ( TradeID BIGINT PRIMARY KEY IDENTITY(1,1), CardID CHAR(10) FOREIGN KEY REFERENCES BankCard(CardID) NOT NULL, TradeDate DATETIME NOT NULL, TradeMoney MONEY CHECK(TradeMoney>0), TradeType char(8) CHECK(TradeType='存钱' or TradeType='取钱'))GO
--插入测试数据INSERT INTO BankCard VALUES('123456766','工商银行','田国兴',2000,200)INSERT INTO Trade VALUES('123456766','20080921',30000,'存钱')
--创建存储过程 up_selectTradeInfo 查询时间段内卡的交易信息
USE BankCardManageDB
GOIF EXISTS(SELECT * FROM sys.objects WHERE name='up_selectTradeInfo') DROP PROCEDURE up_selectTradeInfoGOCREATE PROCEDURE up_selectTradeInfo @cardID varchar(10), @startDate smalldatetime,--时间上限 @endDate smalldatetime --时间下限AS BEGIN DECLARE @sqlStr varchar(300) SET @sqlStr='SELECT * FROM Trade WHERE CardID='+str(@cardID) +' AND TradeDate BETWEEN '+@startDate+' AND '+@endDate EXEC(@sqlStr) END
exec up_selectTradeInfo '123456766','20080920','20080921'
在执行存储过程时,发生以下错误消息 295,级别 16,状态 3,过程 up_selectTradeInfo,第 11 行将字符串转换为 smalldatetime 数据类型时失败。
具体解决办法如下:把存储过程里面的SET @sqlStr一句改为(嵌套转换)SET @sqlStr='SELECT * FROM Trade WHERE CardID='+str(@cardID) +' AND TradeDate BETWEEN CONVERT(SMALLDATETIME,'+''''+CONVERT(VARCHAR,@startDate,112)+''''+',120)' +' AND CONVERT(SMALLDATETIME,'+''''+CONVERT(VARCHAR,@endDate,112)+''''+',120)'(注意:在数据类型为datetime时最好不要使用那个BETWEEN)再执行exec up_selectTradeInfo '123456766','20080920','20080921'返回TradeID CardID TradeDate TradeMoney TradeType-------------------- ---------- ----------------------- --------------------- ---------18 123456766 2008-09-21 00:00:00 30000.00 存钱
(1 行受影响)问题解决!!
相关文章推荐
- 对于字符串向smalldatetime转换失败问题的解决
- Delphi 字符串转日期,强大到窒息,VarToDateTime 解决了 困扰很久的小问题
- QT5.3 error: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题解决
- ASP.NET解决Sqlite日期类型问题:该字符串未被识别为有效的 DateTime
- 从字符串向DateTime转换时失败
- 解决“对于常量池来说, 字符串 "..." 的 UTF8 表示过长”以及读取properties中文乱码的问题
- 关于EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 的问题解决方法整理
- LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题解决方法
- DateTime Picker String value 转换 Date (Springmvc 注解@DateTimeFormat) 解决400请求无效问题
- js前台传递json字符串数组到后台有后台转换成list集合或其他格式的问题解决
- java关于字符串转换数组的问题,ss.split(".")转换失败
- 根本上解决“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题
- js中append字符串包含onclick无效传递参数失败问题解决方案
- JSON(3):Java的Date类型转换为符合json语法的字符串遇到的问题及其解决办法
- (转)在VS2005/2008中字符串编码问题的解决及字符串和数值类型常用的转换方法
- IOS 时间字符串转换时间戳失败问题
- " LINK :fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"问题的最终解决办法
- MFC的中文路径的解决问题Ansi、Unicode、UTF8字符串之间的转换
- 星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
- 从字符串向DateTime转换时失败