让哥蛋疼的cast函数

newfang 2012-08-22 01:27:39
为毛
select cast(41110.7832 as int) 返回41110;


select cast(cast(41110.7832 as datetime) as int) 返回41111呢?

求大神指点~~

实际上我是想把一个datetime字段在select语句中按天group by,有别的处理方法也可以·~
...全文
261 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
以学习为目的 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

-。-!!!

中午那帮鸟人把我数据库还原了,我说咋出不来数据呢~~
[/Quote]


解决完问题,然后解决那帮鸟人
newfang 2012-08-22
  • 打赏
  • 举报
回复
-。-!!!

中午那帮鸟人把我数据库还原了,我说咋出不来数据呢~~
以学习为目的 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

回4楼:我
select cast(字段 as int) dt,sum(xx) from table group by cast(字段 as int)

返回两条记录,41110和41111,实际上表内只有2012-07-22的数据,
只返回41110才是我想要的

谢谢大家·~
[/Quote]


--按天分组
select sum(xx) from table group by convert(nvarchar(10),日期字段,120)
--
以学习为目的 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

回4楼:我
select cast(字段 as int) dt,sum(xx) from table group by cast(字段 as int)

返回两条记录,41110和41111,实际上表内只有2012-07-22的数据,
只返回41110才是我想要的

谢谢大家·~
[/Quote]


--按天排序
select sum(xx) from table group by convert(nvarchar(10),日期字段,120)
--
newfang 2012-08-22
  • 打赏
  • 举报
回复
我擦·~重复了·~~
newfang 2012-08-22
  • 打赏
  • 举报
回复
楼上的那个~~~嫂子·~
为毛哥按照你的写法,一条记录也出不来了呢~~

不管是group by CONVERT(VARCHAR(10), 日期字段, 120)
还是group by CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME)
还是group by CAST(CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME) AS INT)

都木有记录返回·~
newfang 2012-08-22
  • 打赏
  • 举报
回复
楼上的那个~~嫂子·~~
为毛哥按照你的写法,一条记录也出不来了~~

不管是group by CONVERT(VARCHAR(10), 日期字段, 120),
还是 CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME)
还是 CAST(CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME) AS INT)

都木有记录~~
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
select CAST(CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME) AS INT) dt,sum(xx) 
from table
group by CAST(CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME) AS INT)
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
CAST(CAST(CONVERT(VARCHAR(10), 日期字段, 120) AS DATETIME) AS INT)
孤独加百列 2012-08-22
  • 打赏
  • 举报
回复

select cast((CASE WHEN DATEPART(HOUR,字段) > 11 THEN DATEADD(HOUR,-12,字段)
ELSE 字段 END) as int) dt,sum(xx)
from table
group by cast((CASE WHEN DATEPART(HOUR,字段) > 11 THEN DATEADD(HOUR,-12,字段)
ELSE 字段 END) as int)

当天时间过12点的减去12个小时试试
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

select cast(41110.7832 as int) 是小数转化为整数,是去尾的方法计算。
select cast(cast(41110.7832 as datetime) as int)是datetime转化为整形,是计算day的。也就是说
41110.7832 实际上是2012-07-22 18:47:48.477 但他转化为整数表示的2012-07-21 号与 1900-01-……
[/Quote]
这个解释的很清楚,赞一个
newfang 2012-08-22
  • 打赏
  • 举报
回复
回4楼:我
select cast(字段 as int) dt,sum(xx) from table group by cast(字段 as int)

返回两条记录,41110和41111,实际上表内只有2012-07-22的数据,
只返回41110才是我想要的

谢谢大家·~
孤独加百列 2012-08-22
  • 打赏
  • 举报
回复
select cast(41110.7832 as int) 是小数转化为整数,是去尾的方法计算。
select cast(cast(41110.7832 as datetime) as int)是datetime转化为整形,是计算day的。也就是说
41110.7832 实际上是2012-07-22 18:47:48.477 但他转化为整数表示的2012-07-21 号与 1900-01-01的所差的天数 + 18:47:48.477,而用datetime直接转化为int行的话就直接计算2012-07-22与 1900-01-01的天数了,所以才差了1天。
实际上我是想把一个datetime字段在select语句中按天group by
那你直接CAST(datetime字段 AS INT)就可以了不经过先转化为小数的形式所有的datetime到int的计算方式都是一样的。
duoxu1983 2012-08-22
  • 打赏
  • 举报
回复
group by convert(nvarchar(10),日期字段,120)
jxqn_liu 2012-08-22
  • 打赏
  • 举报
回复
如果只需要1-31天分组的话可以
Group By Day(datetime)
jxqn_liu 2012-08-22
  • 打赏
  • 举报
回复
Group By Convert(Varchar(10), Datetime, 121)

34,837

社区成员

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

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