首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

问个查询优化的有关问题,是关于时间查询的

2012-03-24 
问个查询优化的问题,是关于时间查询的。比如有个[过磅表],表里有个[过磅时间]字段,时间格式是有年月日,和时

问个查询优化的问题,是关于时间查询的。
比如有个[过磅表],表里有个[过磅时间]字段,时间格式是有年月日,和时分秒。
如“2011-12-12 12:23:21”这样的格式。

那我要查询某一天的过磅记录,该怎么查,字段[过磅时间]我已经加了索引,要考虑使用索引来查,优化效率。

比如查 2011-12-12日的记录,或者查 2011-12月份的记录,或者查某个时间段的记录,
该怎么写sql语句,

[解决办法]

SQL code
--1.select * from tablename where year(colname)=2011 and month(colname)=12--2.select * from tablename where convert(varchar(7),colname,120)='2011-12'
[解决办法]
SQL code
select * from tablename where datepart(yy,colname)=2011 and datepart(mm,colname)=12
[解决办法]
探讨
比如有个[过磅表],表里有个[过磅时间]字段,时间格式是有年月日,和时分秒。
如“2011-12-12 12:23:21”这样的格式。

那我要查询某一天的过磅记录,该怎么查,字段[过磅时间]我已经加了索引,要考虑使用索引来查,优化效率。

比如查 2011-12-12日的记录,或者查 2011-12月份的记录,或者查某个时间段的记录,
该怎么写sql语句,

[解决办法]
--查某天.
select * from 过磅表 where datediff(dd,过磅时间,'2011-12-12') = 0
select * from 过磅表 where convert(varchar(10),过磅时间,120) = '2011-12-12'

--查某月
select * from 过磅表 where datediff(mm,过磅时间,'2011-12-01') = 0
select * from 过磅表 where convert(varchar(7),过磅时间,120) = '2011-12'

[解决办法]

2012-12-12 索引可以使用 
 select * from tablename where colname between '2012-12-12' and '2012-12-13'
2012-12 索引可以使用 
 select * from tablename where colname between '2012-12-01' and '2013-01-01'
'2012-12-12' 默认时间比较 '2012-12-12 00:00:00'


[解决办法]
-- 按日期查
declare @time varchar(20)
set @time = '2011-09-16'
declare @now datetime
declare @start datetime
declare @end datetime
select @now = convert(datetime,@time)
set @start =dateadd(day,-1,@now)
set @end = dateadd(day,1,@now)
select * from reports where createTime> @start and createTime <@end

--按月份查
declare @time varchar(20)
set @time = '2011-09'
declare @start datetime
select @start =convert(datetime,@time+'-01')
declare @end datetime
set @end = dateAdd(month,1,@start)

[解决办法]
-- 按日期查
declare @time varchar(20)
set @time = '2011-09-16'
declare @now datetime
declare @start datetime
declare @end datetime
select @now = convert(datetime,@time)
set @start =dateadd(day,-1,@now)
set @end = dateadd(day,1,@now)
select * from reports where createTime> @start and createTime <@end

--按月份查
declare @time varchar(20)
set @time = '2011-09'
declare @start datetime
select @start =convert(datetime,@time+'-01')
declare @end datetime
set @end = dateAdd(month,1,@start)

-- http://www.ia00.com
[解决办法]
SQL code
SELECT * FROM TABWHERE 过磅时间 >= '2011-12-12'AND 过磅时间 < '2011-12-13'
[解决办法]
colname between '2012-12-12' and '2012-12-13 23:59:59:999'

[解决办法]
探讨
colname between '2012-12-12' and '2012-12-13 23:59:59:999'

[解决办法]
12楼基本正确了?,只是没处理好>=


SQL code
-- 按日期查declare @time varchar(20)set @time = '2011-09-16'declare @now datetimedeclare @start datetimedeclare @end datetimeselect @now = convert(datetime,@time)set @start = CONVERT(VARCHAR(10),@now,120)set @end = dateadd(day,1,@start)select * from reports where createTime >= @start and createTime <@end--按月份查declare @time varchar(20)set @time = '2011-09'declare @start datetimeselect @start =convert(datetime,@time+'-01')declare @end datetimeset @end = dateAdd(month,1,@start)select * from reports where createTime >= @start and createTime <@end--按日期段查declare @time1 varchar(20)set @time1 = '2011-09-16'declare @time2 varchar(20)set @time2 = '2011-09-24'declare @start datetimedeclare @end datetimeselect @start =convert(datetime,@time1)set @end = dateAdd(DAY,1,@time2)select * from reports where createTime >= @start and createTime <@end 


[解决办法]
colname between '2012-12-12' and '2012-12-13'
会把'2012-12-13'这个时间点数据也包括,所以不能用
[解决办法]

SQL code
where colname  >= '2011-12-12' and colname < '2011-12-13'where colname  >=convert(varchar(10),getdate(),120) and colname  <convert(varchar(10),getdate()+1,120)where colname  >=convert(varcha(7),getdate(),120)+'01' and colname  <convert(varchar(7),dateadd(mm,1,getdate()),120)+'01'
[解决办法]
探讨

colname between '2012-12-12' and '2012-12-13'
会把'2012-12-13'这个时间点数据也包括,所以不能用

[解决办法]
--这样会用到[过磅时间]索引
select * from [过磅表] where [过磅时间]>='20120101' and [过磅时间]<='20120101 23:59'

热点排行
Bad Request.