对于字符串向smalldatetime转换失败问题的解决
大家好,又见面了,我是你们的朋友全栈君。此类问题一般出现于动态存储过程,我以up_selectTradeInfo为例简单说明该问题的解决方法
–建表
–银行卡表
GO
USE BankCardManageDB
GO
IF EXISTS (SELECT * FROM sys.objects WHERE NAME=’BankCard’)
DROP TABLE BankCard
CREATE 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 BankCardManageDB
IF EXISTS(SELECT * FROM sys.objects WHERE NAME=’Trade’)
DROP TABLE Trade
CREATE 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
GO
IF EXISTS(SELECT * FROM sys.objects WHERE name=’up_selectTradeInfo’)
DROP PROCEDURE up_selectTradeInfo
GO
CREATE 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 行受影响)
问题解决!!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144781.html原文链接:https://javaforall.cn
相关文章
- int型转换为long型遇到的一个小问题
- 【说站】java SimpleDateFormat如何转换局部变量
- pytorch tensor操作:tensor与numpy转换
- java 字符串和整型的相互转换_整型数组转换成字符串
- python unicode编码转换utf-8编码_不成问题的问题人物解析
- 盘点一个Python列表转换为字典并排序的问题
- Java 中图片与二进制之间如何相互转换?
- LeetCode171-Excel表列序号(进制转换问题)
- WPF 已知问题 dotnet 6 设置 InvariantGlobalization 之后将丢失默认绑定转换导致 XAML 抛出异常
- SQL开发知识:Oracle全角数字如何转换半角数字
- 详解postgresql查询结果自动将大写的名称转换为小写问题
- Go语言接口和类型之间的转换
- MySQL优化案例之隐式字符编码转换
- MySQL转换时间戳的应用实践(mysql转换成时间戳)
- 戳MSSQL字段时间转换为时间戳(mssql转时间)
- MySQL实现一列数据转换为多行数据(mysql 一列转多行)
- Oracle的混合数据双重视角的转换(oracle两部分数据)
- Oracle UTC 配置实现时区无缝转换(oracle utc配置)
- 解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
- Extjs显示从数据库取出时间转换JSON后的出现问题
- javascript实现全角与半角字符的转换