一个有意思的问题:如何根据一年中的第几周,查询出它周六和周日对应的日期
2011-04-08 07:40
525 查看
在SQL 2005&SQL2008实现这一功能,首先要了解在MSSQL,一年中周的描述。
图1
1.周的第一天,在MSSQL中,可以通过下面的值来描述周的第一天:
美国英语中默认7为一周中的第一天。
通过@@Datefirst函数获取当前周的第一天:
Select @@Datefirst As [周的第一天]
2. 2011-01-01所在的周
Select '2010-12-31' AS [日期],Datepart(week,'20101231') As [周] Union All
Select '2011-01-01',Datepart(week,'20110101') Union All
Select '2011-01-02',Datepart(week,'20110102') Union All
Select '2011-01-03',Datepart(week,'20110103')
从这里可以看出,2011-01-01是属于2011年的第1周,2011-01-02就是第2周了 。
了解完上面两点内容描述,回到题目问题,这里取个案例,如要找第16周的周六日对应的日期,
3.按日历图找出第16周
Select Dateadd(week,16-1,'20110101') [2011-01-01过15周后对应的日期]
这里可以看出第16周,是从2011-04-10至2011-04-16,周六日日期是2011-04-1 & 2011-04-16
4.找出周六日出现在日历图中的规律
为了更能简洁的说明,周六日在日历图(1-7位置)出现的规律,这里特别制作一些图形来描述:
接下来,就周六日出现的位置,进行分析:
从上面的图,可以简单分析出下面的算式:
从上面周六、周日位置的变化,可以观察出,无论如何,周六日位置都是在N1-N7之间,
当周的第一天为7,周六的位置变成了N7.这里可以假设,当@@Datefirst=7,周六的等式:
N1(D)+x+(6-7)=N1(D)+6 //x表示未知,N1(D)+6表示,当@@Datefirst=7,周的第一个日期+6天就等于周六的日期
x+(6-7)=+6x=7
这里就可以得出,当@@Datefirst=7,周六的算式:N1(D)+7+(6-7)
分析周六日的算式,可以得出,
周六:If 6>=@@Datefirst Then N1(D)+0+(6-@@Datefirst) Else N1(D)+7+(6-@@Datefirs)
周日:If 7>=@@Datefirst Then N1(D)+0+(7-@@Datefirst) Else N1(D)+7+(7-@@Datefirs)
为了更能说明变化的规律,再看看下面周四的情况:
这里周四的位置变化,如倾斜的"N"字母,套用前面的算式可以得到:
好了,接下来,很容易根据一年中的第几周,查询出它周六和周日对应的日期了
Declare @Week smallint,
@Date datetime
Set datefirst 7 /* 设置周的第一天 */
Set @Week=16 /* 第几周 */
Set @Date=Dateadd(week,@Week-1,rtrim(year(getdate()))+'0101')-datepart(dw,rtrim(year(getdate()))+'0101')+1 /* 算出第16周的第一个日期 */
Select @Week As [周],
@Date+Case When 6>=@@datefirst Then 6-@@datefirst Else 7+(6-@@datefirst) End As [星期六],
@Date+Case When 7>=@@datefirst Then 7-@@datefirst Else 7+(7-@@datefirst) End As [星期日]
---另外一个不用Case的写法:
Select @Week As [周],
@Date+7*Sign(1-Sign(6-@@datefirst+1))+(6-@@datefirst) As [星期六],
@Date+7*Sign(1-Sign(7-@@datefirst+1))+(7-@@datefirst) As [星期日]
图1
1.周的第一天,在MSSQL中,可以通过下面的值来描述周的第一天:
美国英语中默认7为一周中的第一天。
通过@@Datefirst函数获取当前周的第一天:
Select @@Datefirst As [周的第一天]
2. 2011-01-01所在的周
Select '2010-12-31' AS [日期],Datepart(week,'20101231') As [周] Union All
Select '2011-01-01',Datepart(week,'20110101') Union All
Select '2011-01-02',Datepart(week,'20110102') Union All
Select '2011-01-03',Datepart(week,'20110103')
从这里可以看出,2011-01-01是属于2011年的第1周,2011-01-02就是第2周了 。
了解完上面两点内容描述,回到题目问题,这里取个案例,如要找第16周的周六日对应的日期,
3.按日历图找出第16周
Select Dateadd(week,16-1,'20110101') [2011-01-01过15周后对应的日期]
这里可以看出第16周,是从2011-04-10至2011-04-16,周六日日期是2011-04-1 & 2011-04-16
4.找出周六日出现在日历图中的规律
为了更能简洁的说明,周六日在日历图(1-7位置)出现的规律,这里特别制作一些图形来描述:
接下来,就周六日出现的位置,进行分析:
从上面的图,可以简单分析出下面的算式:
从上面周六、周日位置的变化,可以观察出,无论如何,周六日位置都是在N1-N7之间,
当周的第一天为7,周六的位置变成了N7.这里可以假设,当@@Datefirst=7,周六的等式:
N1(D)+x+(6-7)=N1(D)+6 //x表示未知,N1(D)+6表示,当@@Datefirst=7,周的第一个日期+6天就等于周六的日期
x+(6-7)=+6x=7
这里就可以得出,当@@Datefirst=7,周六的算式:N1(D)+7+(6-7)
分析周六日的算式,可以得出,
周六:If 6>=@@Datefirst Then N1(D)+0+(6-@@Datefirst) Else N1(D)+7+(6-@@Datefirs)
周日:If 7>=@@Datefirst Then N1(D)+0+(7-@@Datefirst) Else N1(D)+7+(7-@@Datefirs)
为了更能说明变化的规律,再看看下面周四的情况:
这里周四的位置变化,如倾斜的"N"字母,套用前面的算式可以得到:
好了,接下来,很容易根据一年中的第几周,查询出它周六和周日对应的日期了
Declare @Week smallint,
@Date datetime
Set datefirst 7 /* 设置周的第一天 */
Set @Week=16 /* 第几周 */
Set @Date=Dateadd(week,@Week-1,rtrim(year(getdate()))+'0101')-datepart(dw,rtrim(year(getdate()))+'0101')+1 /* 算出第16周的第一个日期 */
Select @Week As [周],
@Date+Case When 6>=@@datefirst Then 6-@@datefirst Else 7+(6-@@datefirst) End As [星期六],
@Date+Case When 7>=@@datefirst Then 7-@@datefirst Else 7+(7-@@datefirst) End As [星期日]
---另外一个不用Case的写法:
Select @Week As [周],
@Date+7*Sign(1-Sign(6-@@datefirst+1))+(6-@@datefirst) As [星期六],
@Date+7*Sign(1-Sign(7-@@datefirst+1))+(7-@@datefirst) As [星期日]
相关文章推荐
- 如何判断一个日期是不是周六和周日
- 判断一个日期是否是周六、周日
- JS时间(一个日期返回周日与周六、yyyy-mm-dd转Date、Date yyyy-dd-mm)
- 根据当前第几周,获取这一周的日期,(问题关键是获取该月份的第几天即可)
- 【Maven+SSM】如何通过Mybatis写一个中文查询请求及所遇到的问题
- 多表内连接查询关键字不对应时要注意的一个问题
- 根据指定时间范围取得对应(第几)周信息,以及一年当中所有周时间范围列表信息(可用于学期第几周,年第几周)
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]
- W3wp.exe内存占用问题以及如何查看一个网站对应的w3wp.exe(转)
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- 根据传入的日期,得到日期所在的周数(当天所在的一年中的第几周)
- 项目查询日期的一个小问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 有四个label,分别是label1,label2,……,label4,如何根据一个1-4的整数,取对应的label的caption
- 建站或者网站搬家换空间的时候,企业站长最关心的一个问题是该如何选择网站空间,而这一问题对于一些擅长的站长来说非常小意思,但对于部分企业站长来说是一个比较头疼的问题。根据不完整数据显示,很多企业站长因为
- Oracle如何根据一个日期计算同比环比的日期
- 怎么知道一个日期是一年中的第几周?
- hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?
- Android Cursor的问题 如何查询得到的内容很多,如何取其中的特定的一个