请教一个关于索引的问题

u011823906 2013-09-02 09:23:52
表A中一个字段是datetime型,放的是例如2013-07-16 15:02:09.123
并对这个字段单独建了索引,我要查询整个7月份(1-31号)的数据,where 条件要怎样写才能利用上这个索引?
...全文
131 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011823906 2013-09-02
  • 打赏
  • 举报
回复
引用 10 楼 u011823906 的回复:
[quote=引用 9 楼 wwwwgou 的回复:] [quote=引用 8 楼 u011823906 的回复:] 如果我要统计7月份里超过10天都有记录的ID列表呢?
论坛里,前几天有类似的帖子。楼主给些数据,大家给你写一下。[/quote] 表A中一个字段是datetime型, 例如: id dt money '101' 2013-07-16 15:02:09.123 1 '101' 2013-07-16 20:12:01.234 1 '102' 2013-07-17 06:01:09.789 3 ... 我要统计7月份里超过10天都有记录的ID列表,并计算这些id的money[/quote] 我市这样写的 SELECT X.id,SUM(F),COUNT(*)FROM (SELECT dt,id,sum(money) AS F,COUNT(*) AS C FROM A WHERE dt>='20130701' AND dt<='20130731' GROUP BY dt,id ) X GROUP BY X.id HAVING COUNT(*)>10
u011823906 2013-09-02
  • 打赏
  • 举报
回复
引用 9 楼 wwwwgou 的回复:
[quote=引用 8 楼 u011823906 的回复:] 如果我要统计7月份里超过10天都有记录的ID列表呢?
论坛里,前几天有类似的帖子。楼主给些数据,大家给你写一下。[/quote] 表A中一个字段是datetime型, 例如: id dt money '101' 2013-07-16 15:02:09.123 1 '101' 2013-07-16 20:12:01.234 1 '102' 2013-07-17 06:01:09.789 3 ... 我要统计7月份里超过10天都有记录的ID列表,并计算这些id的money
Shawn 2013-09-02
  • 打赏
  • 举报
回复
引用 8 楼 u011823906 的回复:
如果我要统计7月份里超过10天都有记录的ID列表呢?
论坛里,前几天有类似的帖子。楼主给些数据,大家给你写一下。
u011823906 2013-09-02
  • 打赏
  • 举报
回复
引用 7 楼 wwwwgou 的回复:
[quote=引用 6 楼 u011823906 的回复:] 我要按天group by呢?用 group by datename吗?这样的话索引会失效吧?
--按天group by索引会失效。
SELECT dt=CONVERT(CHAR(10),dt,120),cnt=COUNT(*) FROM tb
WHERE dt >= '2013-07-01' AND dt < '2013-08-01'
GROUP BY CONVERT(CHAR(10),dt,120) --可以先过滤再GROUP BY;如果你对所有数据都GROUP BY,也就没必须用索引了
[/quote] 如果我要统计7月份里超过10天都有记录的ID列表呢?
Shawn 2013-09-02
  • 打赏
  • 举报
回复
引用 6 楼 u011823906 的回复:
我要按天group by呢?用 group by datename吗?这样的话索引会失效吧?
--按天group by索引会失效。
SELECT dt=CONVERT(CHAR(10),dt,120),cnt=COUNT(*) FROM tb
WHERE dt >= '2013-07-01' AND dt < '2013-08-01'
GROUP BY CONVERT(CHAR(10),dt,120) --可以先过滤再GROUP BY;如果你对所有数据都GROUP BY,也就没必须用索引了
u011823906 2013-09-02
  • 打赏
  • 举报
回复
引用 1 楼 wwwwgou 的回复:
SELECT * FROM tb
WHERE dt >= '2013-07-01' AND dt < '2013-08-01'	--dt不要放在函数里,右边的日期可以动态地算出来
如果dt字段里 2013-07-16 15:02:09.123 2013-07-16 20:12:01.234 2013-07-17 06:01:09.789 我要按天group by呢?用 group by datename吗?这样的话索引会失效吧?
Shawn 2013-09-02
  • 打赏
  • 举报
回复
引用 2 楼 js_szy 的回复:
你这1月得两牌子,不请客吃饭么
稍安,等升星了,咱们非技术区聚餐。
Shawn 2013-09-02
  • 打赏
  • 举报
回复
select * from 表A
where [字段] between '2013-07-01 00:00:00' and '2013-07-31 23:59:59.997' --最好加上.997
唐诗三百首 2013-09-02
  • 打赏
  • 举报
回复

select * from 表A
 where [字段] between '2013-07-01 00:00:00' and '2013-07-31 23:59:59'
华夏小卒 2013-09-02
  • 打赏
  • 举报
回复
引用 1 楼 wwwwgou 的回复:
SELECT * FROM tb
WHERE dt >= '2013-07-01' AND dt < '2013-08-01'	--dt不要放在函数里,右边的日期可以动态地算出来
你这1月得两牌子,不请客吃饭么
Shawn 2013-09-02
  • 打赏
  • 举报
回复
SELECT * FROM tb
WHERE dt >= '2013-07-01' AND dt < '2013-08-01'	--dt不要放在函数里,右边的日期可以动态地算出来
Shawn 2013-09-02
  • 打赏
  • 举报
回复
引用 11 楼 u011823906 的回复:
我市这样写的 SELECT X.id,SUM(F),COUNT(*)FROM (SELECT dt,id,sum(money) AS F,COUNT(*) AS C FROM A WHERE dt>='20130701' AND dt<='20130731' GROUP BY dt,id ) X GROUP BY X.id HAVING COUNT(*)>10
--如果你的10天不要求连续的话,参考如下:
SELECT id, total=SUM(total)
FROM
(
	SELECT
		id,
		[date]=CONVERT(CHAR(10),dt, 120),
		total=SUM([money]),
		cnt = COUNT(*)
	FROM #temp
	WHERE dt >= '20130701' AND dt < '20130801'
	GROUP BY [id], CONVERT(CHAR(10),dt, 120)
) t
GROUP BY id
HAVING COUNT(*) > 10

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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