34,589
社区成员
发帖
与我相关
我的任务
分享
select convert(varchar(50),201712) + '10' -1 as '日期'
select CAST(convert(varchar(50),201712) + '10' as int)-1 as '日期'
[/quote]
操作符的两个数据类型必须转成一样,不一样就会发生转换,建议看看SQL Server 联机帮助睥文档中对表达式和数据类型转换的说明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(最低)
select CAST(convert(varchar(50),201712) + '10' as DATETIME)-1 as '日期'
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
*/
--不推荐这种做法(隐式转换),很可能带来效率的降低,尽量显式转换成同类型后再加减。
select CAST(convert(varchar(50),201712) + '10' as int)-1 as '日期'