日期:2014-05-16  浏览次数:20945 次

sql 时间处理
给定一段时间,查询时分别按 年、月、日、周 来检索数据,如何实现?
如:2013-2-1至2014-2-1
按年查询就应该是查询 
  2013年 :2013-2-1至2013-12-31
  2014年:2014-1-1 至2014-2-1
按月查询就应该是查询 
  2013年2月 :2013-2-1至2013-2-28
  2013年3月 :2013-3-1至2013-3-31 。。。
按周查询就应该是查询 
  2013年第五周 :2013-2-1至2013-2-2
  2013年第六周 :2013-2-3至2013-2-9。。。
按日查询就应该是查询 
  。。。

众神速速归位
------解决方案--------------------
--按年查询 
select * from table1 where  year(时间)=2013
--按月查询 
select * from table1 where  convert(varchar(7),时间,23)='2014-03'
--按周查询   2013年第五周
select * from table1  where year(时间)=2013 and datepart(dw,'时间')=5

------解决方案--------------------
select * from (
select sum(value) value ,month(count_date) m,year(count_date) y
from table1
group by cube(month(count_date),year(count_date) )
)f
where f.m is null
 上面的例子是按照年检索
可以使用cube试试,
需要按年就把其他字段的值设为空

------解决方案--------------------
首先将查询时间段转为起始时间和结束时间,例如2013年,那么begintime:2013-01-01 00:00:00,endtime:2013-12-31 23:59:59,然后将其给给定时间段做比较,取重叠部分就可以了,其它的都按这个来处理
------解决方案--------------------
可以用datepart()函数获取年,月,日,周的值,
如   datepart(yy,[字段])        --> 按年查询
       datepart(mm,[字段])    --> 按月查询 
       datepart(wk,[字段])      --> 按周查询 
------解决方案--------------------
这样?

declare @datepart varchar(50)='week'
declare @begindate datetime='2013-02-01',@enddate datetime='2014-03-01'

with all_date as(
select DATEADD(day,number,@begindate) as eachdate,
case when @datepart='year' then DATEPART(year,DATEADD(day,number,@begindate))
when @datepart='month' then DATEPART(month,DATEADD(day,number,@begindate))
when @datepart='day' then DATEPART(day,DATEADD(day,number,@begindate))
when @datepart='week' then DATEPART(week,DATEADD(day,number,@begindate)) end as eachdatepart
from master..spt_values where type='P' and number<=DATEDIFF(day,@begindate,@enddate))
select min(eachdate) as begindate,max(eachdate) as enddate
from all_date
group by eachdatepart,YEAR(eachdate)
order by begindate

------解决方案--------------------
看到12楼的回复,觉得是一个好方法,
http://wenku.baidu.com/link?url=2EGkAXDf3rZ_aJBc8USam5hf-X8dJqc8cY_kc7SMJ5oeD5AQuf7ukIpWuOhS090VpVOZXfUZP7lMj8O9ZQ564MwQB-H6CsESotmy7BKVGN7
这个里面是根据时间列表来获取数据(不过只有年,月,日 来获取的,按周 楼主可以自己写一个)
------解决方案--------------------
引用:
Quote: 引用:

这样?

declare @datepart varchar(50)='week'
declare @begindate datetime='2013-02-01',@enddate datetime='2014-03-01'

with all_date as(
select DATEADD(day,number,@begindate) as