sql server 标识星期数

来源:互联网 发布:个算法不可以没有输出 编辑:程序博客网 时间:2024/05/15 23:45

这段时间抽空就学习了一下SQL SERVER 2005,把在学习过程中的一些小的细节和问题写一点点总结.
星期数的设置
  1.datefirst
(1) 在SQL中指定星期数要依赖系统会话选项datafirst的设置,它表示每周的第一天,如星期一为1,星期二为2,以

些类推.
    例如:set datefirst 1;表示此时系统中的一周的开始是星期一.
(2) 系统中可以通过@@datefirst(返回类型为tinyint)全局变量来查询当前SQL Server系统的datefirst的值(select @@datefirst;).
(3)系统设置它的值有两种:第一种就是(1)介绍的直接设置.第二种是它要根据当前sql中语言来确定(比如设置为language为us_enlish时,此时的datefirst值为7.而设置为Italian时,值为1),
注意:a.当系统中显示设置有datefirst时,设置优先;当没有直接设置时才以系统当前的语言为准.
     b.可以直接设置设置系统中的语言会话选项,当没有时,会根据登录数据时的语言为准.
     c.显示设置SQ显示的语言会话,如:set language us_english.查看当前系统的语言,用select @@language返回数据类型为nvarchar.
       也可以使用全局变量@@langid,返回的数值类型为smallint.如select @@langid;返回值为0时,表示当前语言为us_english.
     d. 运行不带有参数的sp_helplanguage(表示 excu sp_helplanguage)就可以查看系统中所有语言的信息.
   2.datepart函数.
   这里只介绍它用于返回一周的第几天.这种用法为 select datepart(weekday,'20091214');因为它返回的是 

指定时间在它一周中的第几天,所以它会受到datefirst的影响.
 示例:  set datefirst 2;
  select datename(weekday,'20091214');--返回"星期一"(language为简体中文).
  select datepart(weekday,'20091414');--返回7.
  说明:第一句表示一周从星期二开始,第二句表示返回当天是星期几,这里是'星期一',但datepart所返回的值为7,因为它从周二开始,所以周一为一周的结束,也就是第七天.
 

   3.datename函数(函数具体的用法将在"日期函数"中进行总结)
     这里也只介绍它表示星期时的用法,select datename(weekday,'20091214')返回
"星期一",它表示指定日期在它所属的周是星期几,其值不受datefirst的影响.当然它和系统当前语言选项有关,

因为不同的语言表示的形式不同,如英语"monday",中文"星期一"

 (1)以上说明的问题只是想解决一个问题"标识星期数",也就是指定一个日期是一周中的第几天,而且不

依赖系统的设置和开关(如上面的datefirst,language等会话选项)
 理解到:星期数的坐标轴是循环的,datefirst的值与星期数的值成反比.可以用以下语句来削除

datefirst的影响(因为language对datefirst有影响,所以这里也消除了语言对它的影响).
 select datepart(weekday,cast('20091214' as datetime) + @@datefirst);这时不论languae

datefirst会话选项的值是多少,都是返回 2.
      (2)以下更难理解,以上语句无论它两个选项的值是多少都返回2.这里就有datefirst逻辑上的值的说法.上

式逻辑值为7,也就是说一周从星期天开始.但假如我想返回上式的日期返回1.也就是说从星期一开始,则此时

datefirst的逻辑值为1.(重点说明:这里的datefirst的逻辑值与其值没有任何关系)
      select datepart(weekday, cast('20091214' as datetime) + @@datefirst - n) --n表示datefirst的

逻辑值.
      当n为1时表示逻辑上从星期一开始,则返回1,
      当n为2时表示逻辑上从星期二开始,则返回7.以此类推
      这一点主要理解datefirst逻辑值与它本身的值没有任何关系.

备注:以上有所有SQL语言请见"sql之星期"的查询.还有上面sp_helplanguage函数参考sql函数部分的总结)

以下为示例sql代码,因为没有附件,所有就只有贴出来

 

--datefirst的用法goset datefirst 2 ;set language us_english;--没有显示设置datefirst时,它会受到会话选项language的影响select @@datefirst;go--执行上批处理时,返回的是2,因为显示地设置了datefirst后,设置语言不会对datefirst产生影响.只执行后面两句,返回7--以下是对会话选项语言的设置说明goset language us_english;--设置系统的语言为英语set language 简体中文;set language Italian ;select @@language @@langid;--查看系统当前的语言和语言id.exec sp_helplanguage --执行不带参数的该函数,返回系统中所有语言的信息.go--以下是函数datepart在表示星期几的用法GOset datefirst 1--一周以星期一开始select datepart(weekday,'20091214');--返回1,因为日期为星期日.--语言对它的影响set language us_english;select datepart(weekday,'20091214');--返回的为2,因为以美国记法,以星期天为一周的第一天,所以星期一的星期数为2.--星期数不受系统设置和开关的影响的用法set datefirst 1select datepart(weekday,cast('20091214' as datetime) + @@datefirst);--返回的永远是2,与上一句所设置的datefirst的值无关,还有这里的datefirst的逻辑为7select datepart(weekday,cast('20091214' as datetime) + @@datefirst-1);--返回值永远为1,这里datefirst的逻辑值为1.GO--以下为datetime函数表示星期的用法.GOset language 简体中文;select datename(weekday,'20091214');--返回值为"星期一",因为此时language为简体中文,如是us_english返回的是"monday"GO
 ps:这是以总结的给别人看的,文中提到的其他部分会在其他的文章中总结到。
                                                                                                                 2009-12-17