我工作遇到这么一个情况:
算当前周的课程,有两种方法一种是用sql自带的函数datediff(select * from Table8 where datediff(wk,COLUMN8,getdate())=0)
另一种是在c#后台代码中直接写然后传参。我想问一下这两种方法哪一种更好,速度更快。

分析:
看你想把压力给谁
数据量不大的话,还是sql会好一些

 

感悟:

以前都是在后台去算,今天想了想,又查了查。发现在sql里就可以实现。看来我的sql基础实在是太薄弱了。这让我再一次意识到自己还有许多需要学习的。

 

下面程序前辈写的sql取当周时间的详细做法:



如何用sql获取当前周的7个时间



 



 
   
--按日  
   
select sum(consume),day([date]) from consume_record where year([date]) = '2006' group by day([date])  
   
 
   
--按周quarter  
   
select sum(consume),datename(week,[date]) from consume_record where year([date]) = '2006' group by datename(week,[date])  
   
 
   
--按月  
   
select sum(consume),month([date]) from consume_record where year([date]) = '2006' group by month([date])  
   
 
   
--按季  
   
select sum(consume),datename(quarter,[date]) from consume_record where year([date]) = '2006' group by datename(quarter,[date])  
   
 
   
  
   
 
   
--指定日期你就看上面的例子变通下呀,无非就是一个聚合函数和Group by  
   
 
   
select [date],sum(consume) from consume_record where [date] between '2006-06-01' and '2006-07-10' group by [date]   
   

查询当前周: 
   
select * from table 
   
where datediff(wk,startdate,getdate())=0 
   

查询下一周(也就是当前周的下一周): 
   
select * from table 
   
where datediff(wk,startdate,getdate())=-1 
   

查询上一周(也就是当前周的上一周): 
   
select * from table 
   
where datediff(wk,startdate,getdate())=1 
   
/// 
   

declare @today datetime 
   
select @today = convert(varchar(10), getdate(), 20) 
   
declare @weekday int  
   
select @weekday = datepart(weekday, @today) 
   
declare @st datetime, @et datetime  
   
select @st = dateadd(dd, 1-@weekday, @today), @et = dateadd(dd, 7-@weekday, @today) 
   
select * from table 
   
where startdate between @st and @et 
   
当然,这里的开始时间、结束时间跟你sql server的设置有关,即你的周是从周一开始还是从周日开始。 
   

DECLARE @dt datetime 
   
SET @dt=GETDATE() 
   
DECLARE @number int 
   
SET @number=3 
   
--1.指定日期该年的第一天或最后一天 
   
--A. 年的第一天 
   
SELECT CONVERT(char(5),@dt,120)+'1-1' 
   
--B. 年的最后一天 
   
SELECT CONVERT(char(5),@dt,120)+'12-31' 
   

--2.指定日期所在季度的第一天或最后一天 
   
--A. 季度的第一天 
   
SELECT CONVERT(datetime, 
   
    CONVERT(char(8), 
   
        DATEADD(Month, 
   
            DATEPART(Quarter,@dt)*3-Month(@dt)-2, 
   
            @dt), 
   
        120)+'1') 
   
--B. 季度的最后一天(CASE判断法) 
   
SELECT CONVERT(datetime, 
   
    CONVERT(char(8), 
   
        DATEADD(Month, 
   
            DATEPART(Quarter,@dt)*3-Month(@dt), 
   
            @dt), 
   
        120) 
   
    +CASE WHEN DATEPART(Quarter,@dt) in(1,4) 
   
        THEN '31'ELSE '30' END) 
   
--C. 季度的最后一天(直接推算法) 
   
SELECT DATEADD(Day,-1, 
   
    CONVERT(char(8), 
   
        DATEADD(Month, 
   
            1+DATEPART(Quarter,@dt)*3-Month(@dt), 
   
            @dt), 
   
        120)+'1') 
   

--3.指定日期所在月份的第一天或最后一天 
   
--A. 月的第一天 
   
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1') 
   
--B. 月的最后一天 
   
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1') 
   
--C. 月的最后一天(容易使用的错误方法) 
   
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt)) 
   

--4.指定日期所在周的任意一天 
   
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt) 
   

--5.指定日期所在周的任意星期几 
   
--A.  星期天做为一周的第1天 
   
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt) 
   
--B.  星期一做为一周的第1天 
   
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)


  
具体例子: 

SELECT CONVERT(varchar(100), GETDATE(), 0)union--: 05 16 2006 10:57AM  
   
SELECT CONVERT(varchar(100), GETDATE(), 1)union--: 05/16/06  
   
SELECT CONVERT(varchar(100), GETDATE(), 2)union--: 06.05.16  
   
SELECT CONVERT(varchar(100), GETDATE(), 3)union--: 16/05/06  
   
SELECT CONVERT(varchar(100), GETDATE(), 4)union--: 16.05.06  
   
SELECT CONVERT(varchar(100), GETDATE(), 5)union--: 16-05-06  
   
SELECT CONVERT(varchar(100), GETDATE(), 6)union--: 16 05 06  
   
SELECT CONVERT(varchar(100), GETDATE(), 7)union--: 05 16, 06  
   
SELECT CONVERT(varchar(100), GETDATE(), 8)union--: 10:57:46  
   
SELECT CONVERT(varchar(100), GETDATE(), 9)union--: 05 16 2006 10:57:46:827AM  
   
SELECT CONVERT(varchar(100), GETDATE(), 10)union--: 05-16-06  
   
SELECT CONVERT(varchar(100), GETDATE(), 11)union--: 06/05/16  
   
SELECT CONVERT(varchar(100), GETDATE(), 12)union--: 060516  
   
SELECT CONVERT(varchar(100), GETDATE(), 13)union--: 16 05 2006 10:57:46:937  
   
SELECT CONVERT(varchar(100), GETDATE(), 14)union--: 10:57:46:967  
   
SELECT CONVERT(varchar(100), GETDATE(), 20)union--: 2006-05-16 10:57:47  
   
SELECT CONVERT(varchar(100), GETDATE(), 21)union--: 2006-05-16 10:57:47.157  
   
SELECT CONVERT(varchar(100), GETDATE(), 22)union--: 05/16/06 10:57:47 AM  
   
SELECT CONVERT(varchar(100), GETDATE(), 23)union--: 2006-05-16  
   
SELECT CONVERT(varchar(100), GETDATE(), 24)union---: 10:57:47  
   
SELECT CONVERT(varchar(100), GETDATE(), 25)union--: 2006-05-16 10:57:47.250  
   
SELECT CONVERT(varchar(100), GETDATE(), 101)union--: 05/16/2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 102)union--: 2006.05.16  
   
SELECT CONVERT(varchar(100), GETDATE(), 103)union--: 16/05/2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 104)union---: 16.05.2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 105)union--: 16-05-2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 106)union--: 16 05 2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 107)union---: 05 16, 2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 108)union--: 10:57:49  
   
SELECT CONVERT(varchar(100), GETDATE(), 109)union--: 05 16 2006 10:57:49:437AM  
   
SELECT CONVERT(varchar(100), GETDATE(), 110)union--: 05-16-2006  
   
SELECT CONVERT(varchar(100), GETDATE(), 111)union--: 2006/05/16  
   
SELECT CONVERT(varchar(100), GETDATE(), 112)union--: 20060516  
   
SELECT CONVERT(varchar(100), GETDATE(), 113)union--: 16 05 2006 10:57:49:513  
   
SELECT CONVERT(varchar(100), GETDATE(), 114)union--: 10:57:49:547  
   
SELECT CONVERT(varchar(100), GETDATE(), 120)union--: 2006-05-16 10:57:49  
   
SELECT CONVERT(varchar(100), GETDATE(), 121)union--: 2006-05-16 10:57:49.700  
   
SELECT CONVERT(varchar(100), GETDATE(), 126)union--: 2006-05-16T10:57:49.827  
   
SELECT CONVERT(varchar(100), GETDATE(), 130)union--: 18 ???? ?????? 1427 10:57:49:907AM  
   
SELECT CONVERT(varchar(100), GETDATE(), 131)--: 18/04/1427 10:57:49:920AM