首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL Server DatePart 怎么设置一年的第一周

2012-12-15 
SQL Server DatePart 如何设置一年的第一周语句是select DatePart(ww,getdate())默认一年第一周是1月1日所

SQL Server DatePart 如何设置一年的第一周
语句是select DatePart(ww,getdate())
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]]) 
但是一直报错用不了。
求助啊!%>_<%
[最优解释]

declare @d datetime = '2013-01-06'
select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)

[其他解释]

declare @date datetime,@yearFirstDay datetime,@lastYearDay datetime
set @date='2012-1-1' --要计算其周次的日期
set @yearFirstDay=cast(DATEPART(year,@date) as CHAR(4))+'-1-1' --该年的1月1日
set @lastYearDay = cast(DATEPART(year,@date)-1 as CHAR(4))+'-12-31' --去年的12月31日

select 
case 
when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果正好是1月1日所在周,用去年最后一周的周次(一般是53)
and DATEPART(DW,@yearFirstDay) > 1 --判断这一年的1月1号是不是周日(1表示周日,2表示周一。。。)
then DATEPART(WK,@lastYearDay+'-12-31')--53

when DATEDIFF(WK,@yearFirstDay,@date) = 0 --如果是1月1号所在周
and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
then 1 --第一周

when DATEDIFF(WK,@yearFirstDay,@date) > 0 --如果不是1月1号所在周
and DATEPART(DW,@yearFirstDay) = 1 --1月1日正好是周日,则为第一周
then DATEDIFF(WK,@yearFirstDay,@date)+1

else DATEDIFF(WK,@yearFirstDay,@date) --如果是,则1月1号所在周为第一周
end as week --否则,1月1号属于去年最后一周



我写了段实现了我的需求,看起来有点复杂,我相信没多少人看得进去,因为我自己都不愿意看这么复杂的代码的。
之所以没用大家建议的,是因为我不想写存储过程,我写的这个可以直接作为字段用。
写的时候我也觉得这需求太蹩脚了,为什么不能直接用isoweek,但是没办法,之前统计数据库的时候都是用的这个规则,也不能因为我一个人的想法而改变。
我觉得之前之所以会用这一套,是因为在c#里面可以直接指定规则,太方便了,所以没人考虑sql server该怎么办,反正用代码。忽然感觉好悲伤好无力!自己不想绕道用c#写同步程序,结果又不能自如的运用sql server。
所以希望大家以后写程序用什么规则的时候一定要谨慎考虑啊T_T。



[其他解释]
31#怎么应用于列级,24#就怎样应用于列级,公式替换,中间变量和中间结果代入,数学作业做过不少的啦。
[其他解释]
什么意思 没搞懂。。。
[其他解释]
引用:
什么意思 没搞懂。。。


举例子就是
select DatePart(ww,'2013-1-6')
这句执行的结果是2,我想得到1。
[其他解释]
select DatePart(ww,'2013-1-6')-1
这样?
[其他解释]
引用:
select DatePart(ww,'2013-1-6')-1
这样?


那如果是2012年呢?
每一年的起始周不一样。
我想设置成每年第一个周都是整周。
不知道我有没有表达清楚。

select DatePart(ww,'2013-1-1')得到的结果是1,但是在我的观念里他应该是53(属于去年最后一周)。
[其他解释]
明白了 你是想按自然日 取周? 1-7为第一周 8-14为2周
[其他解释]
引用:
明白了 你是想按自然日 取周? 1-7为第一周 8-14为2周


我觉得你应该是明白了,有办法吗?
http://baike.baidu.com/view/327452.htm
这里面给的语法不能用啊。
[其他解释]
select ceiling(cast(DateName (Dy,'2013-1-21') as INT)/7.0)
------其他解决方案--------------------


引用:
select ceiling(cast(DateName (Dy,'2013-1-21') as INT)/7.0)


不是1号-7号为第一周。
2012-1-1到2012-1-7为2012年第一周
2013-1-6到2013-1-12为2013年第一周

T_T这个沟通急死我了。不发帖子我真不知道我的思维原来这么难以理解啊。
[其他解释]
引用:
SQL code?12declare @d datetime = '2013-01-06'select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)


要实现的效果是
2013-1-1为第53周
2013-1-6为第1周
[其他解释]

System.Globalization.Calendar cal = new System.Globalization.CultureInfo("zh-CN").Calendar;
int week =  cal.GetWeekOfYear(countDay, System.Globalization.CalendarWeekRule.FirstFullWeek, System.DayOfWeek.Sunday);


贴段C#吧。里面的week就是我想得到的结果,规则能看的很清楚。
我现在是想用sql里面的datepart得到这个结果,但是sql中间那个参数不是FirstFullWeek.
[其他解释]
引用:
引用:SQL code?12declare @d datetime = '2013-01-06'select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)

要实现的效果是
2013-1-1为第53周
2013-1-6为第1周

真心不懂了 。。。
[其他解释]
引用:
引用:引用:SQL code?12declare @d datetime = '2013-01-06'select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)

要实现的效果是
2013-1-1为第53周
2013-1-6为第……


看下电脑右下角的日历就懂了。
[其他解释]
declare @d datetime = '2013-01-01'
--declare @d datetime = '2013-01-06'

declare @week int = datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)
if (@week=0)
begin
set @d -= datepart(dayofyear,@d)
set @week = datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-1)
end
select @week

[其他解释]
你想获取的是每一年的第一周是哪几天,对吧!
[其他解释]
或者说给出一个日期,判断这个日期是这年的哪一周?
[其他解释]
declare @date date
set @date='2013-1-5'
select CONVERT(varchar(10),@date,23)+'为第'+cast(case when DATEPART(dw,cast(YEAR(@date) as CHAR(4))+'-1-1')<>1 then (case when DatePart(ww,@date)-1=0 then 53 else DatePart(ww,@date)-1 end) else DatePart(ww,@date) end as varchar(2))+'周'
[其他解释]
引用:
或者说给出一个日期,判断这个日期是这年的哪一周?

就是这个意思!你懂我。
我需要知道一个日期是第几周!
[其他解释]
引用:
把楼上的date 改为datetime ,楼主写的是对的。真牛叉

08的话支持date ,05需要改成datetime
[其他解释]
把楼上的date 改为datetime ,楼主写的是对的。真牛叉



[其他解释]
那还不简单 接着修改:
declare @date date
 set @date='2013-1-5'
 select CONVERT(varchar(10),@date,23)+'为第'+cast(case when DATEPART(dw,cast(YEAR(@date) as CHAR(4))+'-1-1')<>1 then (case when DatePart(ww,@date)-1=0 then (DATEPART(dw,cast(YEAR(@date)-1 as CHAR(4))+'-12-31')) else DatePart(ww,@date)-1 end) else DatePart(ww,@date) end as varchar(2))+'周' 
这次应该是终极版了,多谢楼上提醒。
[其他解释]

引用:
declare @date date
set @date='2013-1-5'
select CONVERT(varchar(10),@date,23)+'为第'+cast(case when DATEPART(dw,cast(YEAR(@date) as CHAR(4))+'-1-1')<>1 then (case when DatePart(ww,@date)-1……

when DatePart(ww,@date)-1=0 then 53

这个太想当然了,有可能是52的,2011-01-01就是52。
[其他解释]
引用:
终极版又是想当然,按一下F5先吧。

楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。

SQL code?123declare @d datetime = '2011-01-01', @week intselect @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,……

还是你理解力比较强 厉害! 学习了 
[其他解释]
终极版又是想当然,按一下F5先吧。

楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。

declare @d datetime = '2011-01-01', @week int
select @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,datename(year,@d))-1)
select @week

[其他解释]
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。
请参考我的博客
http://blog.csdn.net/tanleittl/article/details/7933693
[其他解释]
引用:
终极版又是想当然,按一下F5先吧。

楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。

SQL code?123declare @d datetime = '2011-01-01', @week intselect @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,……

看来只能自己拼sql计算吗?
难道sql server没有默认属性可以设置么?
用set DateFirst 1可以设置一周的第一天为周几,为什么没有类似FirstWeekOfYear这种属性。
[其他解释]
这个估计比较困难,sql中都是按照isoweek来处理的,sql中没有直接设置第一周的方法。需要自己去写函数
[其他解释]
引用:
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。
请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693


你要用ISOWEEK,为什么不直接
select DATEPART(ISOWK,'2012-12-31')?

我要的也不是ISOWEEK,是每年的第一个周日所在周为第一周,每周第一天是星期天。

[其他解释]
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。

这个思路可以考虑下,计算你的日期和1月1日的差值,然后除以7就能得到你的周数了
[其他解释]
引用:
这个问题用有那么纠结吗。

then DATEPART(WK,@lastYearDay+'-12-31')--53
凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。

既然不采用别人的建议,我也懒得跟你说我的思路。


不管是不是完整周都行的啊。只有1月1号不是周日,那肯定是跟去年12月31日同属于一周的。


[其他解释]
这个问题用有那么纠结吗。

then DATEPART(WK,@lastYearDay+'-12-31')--53
凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。

既然不采用别人的建议,我也懒得跟你说我的思路。
[其他解释]

引用:
引用:
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。
请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693

你要用ISOWEEK,为什么不直接
select DATEPART(ISOWK,'2012-12-31')?

我要……

select DATEPART(ISOWK,'2012-12-31') 这样的写法在2008以后才可使用
而且,周开始日为周一,与你要的周日不符
[其他解释]
以下是为了回答你在我博客的评论
规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢
就拿2013年来说,1月4号是属于2012年的最后一周。
你这句话,就已经遵循了某一准则
例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。

你的概念似乎非常的混淆

[其他解释]
不是一个意思么,1月1号不是周日,该周是不是跨年了?不是非完整周是什么周。

“肯定是跟去年12月31日同属于一周的”,用你的代码算算20110101和20101231是不是返回相同的周。

按你的思路,还要多一个lastLastYear才能算出去年12月31日,不多说了。

[其他解释]
引用:
终极版又是想当然,按一下F5先吧。

楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。

SQL code?123declare @d datetime = '2011-01-01', @week intselect @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,……


嗯,这个比我的简单好多好多,但是我是想直接用在字段中,就是select表的时候就能直接得出结果。
[其他解释]
引用:
引用:引用:
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。
请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693

你要用ISOWEEK,为什么不直接
select……

嗯,是与我要的不符,所以没能用这个。
[其他解释]
引用:
不是一个意思么,1月1号不是周日,该周是不是跨年了?不是非完整周是什么周。

“肯定是跟去年12月31日同属于一周的”,用你的代码算算20110101和20101231是不是返回相同的周。

按你的思路,还要多一个lastLastYear才能算出去年12月31日,不多说了。

我验证了一下,24楼的写法的确得到我想要的结果了,想把我那复杂的代码删了不过没权限。
现在问题是我看不懂你的这个写法。怎么算出来的?
[其他解释]
引用:
以下是为了回答你在我博客的评论
规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢
就拿2013年来说,1月4号是属于2012年的最后一周。
你这句话,就已经遵循了某一准则
例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。

你的概念似乎非常的混淆

我的要求是第一周为一年的第一个周日所在的周,而每一个周的第一天是星期天。
[其他解释]
null

热点排行