DATETIME OR VARCHAR

zhouixi 2012-05-17 11:35:53

declare @a datetime
select @a=year(getdate())
select @a
go
declare @a varchar(20)
select @a=year(getdate())
select @a


-----------------------
1905-07-06 00:00:00.000

(1 行受影响)


--------------------
2012

(1 行受影响)




这是为啥阿,结果不一样。变成1905年了。
...全文
113 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouixi 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
从1900-01-01 00:00:00.000加上2012天就是1905-07-06 00:00:00.000
[/Quote]

我不解的是,为何要走两步动作。
第一步,取2012
第二步,加1900-01-01
zhouixi 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
第一个:
declare @a datetime 定义日期类型变量@a
select @a=year(getdate()) 给日期@a赋值 @a = 2012相当于 @a = DATEAdd ( day , 2012 , '1900-01-01' )
select @a 所以返回值应该是DATEAdd ( day , 2012 , '1900-01-01' )

第二个:
declar……
[/Quote]

可为什么,既然赋值了2012 还要DATEADD呢?
SqlServer2008 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 1 楼 的回复:
试一下这个就明白了

SQL code

select convert(datetime,2012)


他是不是把2012当成天数了,然后把天数,从1900-01-01加2012(天数)
[/Quote]

是的
zhouixi 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
试一下这个就明白了

SQL code

select convert(datetime,2012)
[/Quote]

他是不是把2012当成天数了,然后把天数,从1900-01-01加2012(天数)
zhouixi 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
@a设置为datetime 在转换的时候隐式装换成了datetime 类型的 当然不是数字了
[/Quote]

我的意思是说。为何变成了1905 而不是2012
Lyongt 2012-05-17
  • 打赏
  • 举报
回复
第一个:
declare @a datetime 定义日期类型变量@a
select @a=year(getdate()) 给日期@a赋值 @a = 2012相当于 @a = DATEAdd ( day , 2012 , '1900-01-01' )
select @a 所以返回值应该是DATEAdd ( day , 2012 , '1900-01-01' )

第二个:
declare @a varchar(20) 定义可变字符串类型变量@a
select @a=year(getdate()) 给字符串赋值 @a = 2012
select @a 所以返回值就是2012

SqlServer2008 2012-05-17
  • 打赏
  • 举报
回复
从1900-01-01 00:00:00.000加上2012天就是1905-07-06 00:00:00.000
--小F-- 2012-05-17
  • 打赏
  • 举报
回复
@a设置为datetime 在转换的时候隐式装换成了datetime 类型的 当然不是数字了
Felixzhaowenzhong 2012-05-17
  • 打赏
  • 举报
回复
year函数返回的是整形(INT)
第二个 SQL 内部做了隐形转换
第一个 不太清楚
SqlServer2008 2012-05-17
  • 打赏
  • 举报
回复
是把2012天转换成年了
SqlServer2008 2012-05-17
  • 打赏
  • 举报
回复
试一下这个就明白了

select convert(datetime,2012)

zhouixi 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
引用 10 楼 的回复:

引用 6 楼 的回复:
第一个:
declare @a datetime 定义日期类型变量@a
select @a=year(getdate()) 给日期@a赋值 @a = 2012相当于 @a = DATEAdd ( day , 2012 , '1900-01-01' )
select @a 所以返回值应该是DATEAdd ( day , 2012 , '……
[/Quote]

因为,YEAR出来的是INT型,
而变量定义的是DATETIME
所以它会强制转换

而语句2VARCHAR
可以隐式转换,所以就是2012咯。 这样理解吗?
孤独加百列 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 6 楼 的回复:
第一个:
declare @a datetime 定义日期类型变量@a
select @a=year(getdate()) 给日期@a赋值 @a = 2012相当于 @a = DATEAdd ( day , 2012 , '1900-01-01' )
select @a 所以返回值应该是DATEAdd ( day , 2012 , '1900-01-01' )
……
[/Quote]

第一个是将一个INT型的值付给了一个DATETIME类型的值,类型不一样进行强制类型转化,而INT转为DATETIME类型的规则就是在1900基础上增加整形的天数。

34,590

社区成员

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

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