varchar字段可以直接减数值吗

小野马1209 2018-01-26 11:23:59
疑问:
前半段我转换成Varchar了 ,为什么可以直接减数值
select convert(varchar(50),201712) + '10' 这段在数据库中是以什么类型存储的
select convert(varchar(50),201712) + '10' -1 as '日期' 


...全文
636 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2018-01-26
  • 打赏
  • 举报
回复
引用 2 楼 kaijie_wu1209 的回复:
[quote=引用 1 楼 zjcxc 的回复:] 后面可以-数字,是因为隐式转换再转成数字了,最终结果数字
在什么情况下会隐式转换呢,我本来想把前半段转换为数值的
select CAST(convert(varchar(50),201712) + '10' as int)-1 as '日期' 
[/quote] 操作符的两个数据类型必须转成一样,不一样就会发生转换,建议看看SQL Server 联机帮助睥文档中对表达式和数据类型转换的说明
中国风 2018-01-26
  • 打赏
  • 举报
回复
隐性转换你需要了解类型的优先级,比如你的例子:数字和字符加减,数字优先会隐性转为数字再加减,如果用我的例子转为日期,日期优先于数字
SQL Server 对数据类型使用以下优先级顺序:


用户定义数据类型(最高)


sql_variant


xml


datetimeoffset


datetime2


datetime


smalldatetime


date


time


float


real


decimal


money


smallmoney


bigint


int


smallint


tinyint


bit


ntext


text


image


timestamp


uniqueidentifier


nvarchar(包括 nvarchar(max)) 


nchar


varchar(包括 varchar(max)) 


char


varbinary(包括 varbinary(max)) 


binary(最低) 

中国风 2018-01-26
  • 打赏
  • 举报
回复
这样?前一段日期减一天
select CAST(convert(varchar(50),201712) + '10' as DATETIME)-1 as '日期'
吉普赛的歌 版主 2018-01-26
  • 打赏
  • 举报
回复
IF OBJECT_ID('tempdb.dbo.tmp') IS NOT NULL 
DROP TABLE tempdb.dbo.tmp
GO
SELECT * 
INTO tempdb.dbo.tmp
FROM (
--做减法,字符串隐式转换成了int
--
select convert(varchar(50),201712) + '10' -1 as '日期'  
) AS t

--最终在数据库中存储也是int
SELECT c.name,s.name,s.xtype,c.max_length,c.system_type_id,c.user_type_id
  FROM tempdb.sys.[columns] AS c INNER JOIN sys.systypes AS s ON c.system_type_id=s.xtype WHERE c.name='日期'
/*
name	name	xtype	max_length	system_type_id	user_type_id
日期	int	    56	    4	        56	                 56
*/

--不推荐这种做法(隐式转换),很可能带来效率的降低,尽量显式转换成同类型后再加减。
小野马1209 2018-01-26
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
后面可以-数字,是因为隐式转换再转成数字了,最终结果数字
在什么情况下会隐式转换呢,我本来想把前半段转换为数值的
select CAST(convert(varchar(50),201712) + '10' as int)-1 as '日期' 
zjcxc 元老 2018-01-26
  • 打赏
  • 举报
回复
后面可以-数字,是因为隐式转换再转成数字了,最终结果数字

34,589

社区成员

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

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