declare @date datetime
set @date = '2010-02-01'declare @firstday datetime,
@lastday datetimeset @firstday = cast(convert(varchar(6),@date,112)+'01' as datetime)
set @lastday = cast(convert(varchar(6),dateadd(dd,32,@firstday),112)+'01' as datetime) -1SET DATEFIRST 1
select datepart(wk,@lastday) - datepart(wk,@firstday)+1
set @date = '2010-02-01'declare @firstday datetime,
@lastday datetimeset @firstday = cast(convert(varchar(6),@date,112)+'01' as datetime)
set @lastday = cast(convert(varchar(6),dateadd(dd,32,@firstday),112)+'01' as datetime) -1SET DATEFIRST 1
select datepart(wk,@lastday) - datepart(wk,@firstday)+1
解决方案 »
- 急求Sql,请各位帮助,谢谢!
- SQL_Latin1_General_CP1_CI_AS 怎么查询出来汉字列,显示汉字,不是乱码
- 磁盘数据库的资料
- 看了邹健一个函数例子,可是不知道怎么用?
- 在存储过程中远程连结数据库服务器问题
- 弱弱的问一下:在SQL存储过程里。查询语句怎么用变理本作字段名或表名,有没有变通的方法。
- 求sql 筛选出现次数大于2次的人物
- 跟踪PB提供的SQL的程序
- 如何在连接ODBC数据源失败后,不弹出ODBC设置提示框?
- [求助]关于Microsoft SQL Server 2012 Express 数据库连接的问题
- 请问如何在SQLSever中实现类似Oracle这条语句的功能: Select distinct * from test where rownum <= 100
- vb+sql : my.open "select * into tablename1 from tablename2 where name=up and ......",cn
在Sql Server中有這樣一個函數DATEPART,我們可以使用它傳回代表指定日期的指定日期部份之整數。語法為DATEPART ( datepart , date ),我們所熟知的DAY、MONTH 和 YEAR 等函數分別是 DATEPART(dd, date)、DATEPART(mm, date) 與 DATEPART(yy, date) 的同義字。用DATEPART(wk,date),就可以得到日期所在的週數,而如果反過來,從週數得到這一週的七天,就需要我們自己來寫了。
首先我們分析一下,有週數就一定可以算出這一週的七天嗎?不,因爲每年的相同週數的七天日期都不一樣,所以我們需要知道的必要條件是:年數和週數。兩者缺一不可。
在Sql Server中每週的開始是週日,最後一天是週六。每年的第一週是從1月1號到第一個週六,每年的最後一週是從最後一個週日到12月31號,因此每年的第一週和最後一週是不完整的。如果我們需要得出給定週次的開始日期和結束日期,那麽先計算出第一週的結束日期,然後加上7*週次,就可得出給定週次的結束日期,在把這個日期減去6,就是給定週次的開始日期。在這裡我們可以使用DATEADD函數,它的作用是在指定日期新增一個時間間隔,並傳回新的 datetime 值。語法:DATEADD ( datepart , number, date ) 那麽代碼可以是這樣的:
declare @week int;
set @week=9;
Select dateadd(day,-6, dateadd(day,7 * (@week-1),第一週的最後一天),dateadd(day,7 * (@week-1),第一週的最後一天)
code 1
那麽我們接下來的任務就是算出第一週的最後一天了,因爲給定年數,所以我們可以先用函數DATEPART算出1月1號星期幾,再加上相應的的天數即可:
Select datepart(dw,’2000/1/1’) /*假設給定的年數是2000年,取得一月一號是週幾*/
Code 2
一月一號再過(7- datepart(dw,’2000/1/1’))天,就是第一週的最後一天:
Select dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’)
Code 3
我們把第一週的最後一天加入到code 1里去,就得到了如下的代碼:
declare @week int;
set @week=9;
Select dateadd(day,-6, dateadd(day,7 * (@week-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’)),dateadd(day,7 * (@week-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’))
code 4
那麽得到當前日期的函數是getdate(),得到當前週數的函數就是datepart(dw,getdate());我們用datepart(dw,getdate())去取代code 4的@ week,就像下面一樣:
Select
dateadd(day,-6, dateadd(day,7 * (datepart(dw,getdate())-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’)),
dateadd(day,7 * (datepart(dw,getdate())-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’))
Code 5
是否可以得到当前日期所在周的開始日期和結束日期呢?那肯定是對的,可是我們有更簡單的方法。請看下一節……b, 如何在Sql Server中已知日期,計算出所在週的開始日期和結束日期
既然已經知道日期了,那麽我們可以算出日期是星期幾,用dateadd函數兩頭一減,就可以算出所在週的開始日期和結束日期,需要説明的是,在Sql Server中,雖然month的範圍是1~12,day of year的範圍是1~366,day的範圍是1~31,可是week的範圍卻是0~6,0代表星期六,1,代表星期一,以此類推,千萬不要認爲1~7哦!
見下表:
Datepart 縮寫 取值範圍
Year yy, yyyy 1753~9999
Quarter qq, q 1~4
Month mm, m 1~12
Dayofyear dy, y 1~366
Day dd, d 1~31
Week wk, ww 0~51
Hour hh 0~23
Minute mi, n 1~59
Second ss, s 1~59
Millisecond ms 0~999代碼如下:
Select
dateadd(dy,1-datepart(dw,getdate()),getdate()),
dateadd(dy,7-datepart(dw,getdate()),getdate())
Code 6
是不是code6比code5簡單多了?其實有時候我們想算法的時候,會很容易走錯路,雖然最後還是走到終點,卻發現是繞了一段遠路,我在coding的時候就是這樣的,唉,需要改進。