SQL Server DatePart 如何设置一年的第一周

poyosakura 2012-11-16 05:47:00
语句是select DatePart(ww,getdate())
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]])
但是一直报错用不了。
求助啊!%>_<%
...全文
894 41 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vidor 2012-11-19
  • 打赏
  • 举报
回复
31#怎么应用于列级,24#就怎样应用于列级,公式替换,中间变量和中间结果代入,数学作业做过不少的啦。
DBA_磊仔 2012-11-19
  • 打赏
  • 举报
回复
以下是为了回答你在我博客的评论 规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢 就拿2013年来说,1月4号是属于2012年的最后一周。 你这句话,就已经遵循了某一准则 例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。 你的概念似乎非常的混淆
DBA_磊仔 2012-11-19
  • 打赏
  • 举报
回复
引用 28 楼 poyosakura 的回复:
引用 27 楼 tanleittl 的回复: 实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。 请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693 你要用ISOWEEK,为什么不直接 select DATEPART(ISOWK,'2012-12-31')? 我要……
select DATEPART(ISOWK,'2012-12-31') 这样的写法在2008以后才可使用 而且,周开始日为周一,与你要的周日不符
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 24 楼 Vidor 的回复:
终极版又是想当然,按一下F5先吧。 楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。 SQL code?123declare @d datetime = '2011-01-01', @week intselect @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,……
嗯,这个比我的简单好多好多,但是我是想直接用在字段中,就是select表的时候就能直接得出结果。
Vidor 2012-11-19
  • 打赏
  • 举报
回复
不是一个意思么,1月1号不是周日,该周是不是跨年了?不是非完整周是什么周。 “肯定是跟去年12月31日同属于一周的”,用你的代码算算20110101和20101231是不是返回相同的周。 按你的思路,还要多一个lastLastYear才能算出去年12月31日,不多说了。
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 32 楼 Vidor 的回复:
这个问题用有那么纠结吗。 then DATEPART(WK,@lastYearDay+'-12-31')--53 凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。 既然不采用别人的建议,我也懒得跟你说我的思路。
不管是不是完整周都行的啊。只有1月1号不是周日,那肯定是跟去年12月31日同属于一周的。
Vidor 2012-11-19
  • 打赏
  • 举报
回复
这个问题用有那么纠结吗。 then DATEPART(WK,@lastYearDay+'-12-31')--53 凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。 既然不采用别人的建议,我也懒得跟你说我的思路。
poyosakura 2012-11-19
  • 打赏
  • 举报
回复

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。
  • 打赏
  • 举报
回复
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。 这个思路可以考虑下,计算你的日期和1月1日的差值,然后除以7就能得到你的周数了
  • 打赏
  • 举报
回复
这个估计比较困难,sql中都是按照isoweek来处理的,sql中没有直接设置第一周的方法。需要自己去写函数
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 27 楼 tanleittl 的回复:
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。 请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693
你要用ISOWEEK,为什么不直接 select DATEPART(ISOWK,'2012-12-31')? 我要的也不是ISOWEEK,是每年的第一个周日所在周为第一周,每周第一天是星期天。
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 34 楼 Vidor 的回复:
不是一个意思么,1月1号不是周日,该周是不是跨年了?不是非完整周是什么周。 “肯定是跟去年12月31日同属于一周的”,用你的代码算算20110101和20101231是不是返回相同的周。 按你的思路,还要多一个lastLastYear才能算出去年12月31日,不多说了。
我验证了一下,24楼的写法的确得到我想要的结果了,想把我那复杂的代码删了不过没权限。 现在问题是我看不懂你的这个写法。怎么算出来的?
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 36 楼 tanleittl 的回复:
引用 28 楼 poyosakura 的回复:引用 27 楼 tanleittl 的回复: 实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。 请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693 你要用ISOWEEK,为什么不直接 select……
嗯,是与我要的不符,所以没能用这个。
poyosakura 2012-11-19
  • 打赏
  • 举报
回复
引用 37 楼 tanleittl 的回复:
以下是为了回答你在我博客的评论 规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢 就拿2013年来说,1月4号是属于2012年的最后一周。 你这句话,就已经遵循了某一准则 例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。 你的概念似乎非常的混淆
我的要求是第一周为一年的第一个周日所在的周,而每一个周的第一天是星期天。
DBA_磊仔 2012-11-18
  • 打赏
  • 举报
回复
实际上,逻辑等价转换之后,你的逻辑就是 1月7号所在的周就是第一周,而每一周的第一天是星期天。 请参考我的博客 http://blog.csdn.net/tanleittl/article/details/7933693
poyosakura 2012-11-17
  • 打赏
  • 举报
回复
引用 24 楼 Vidor 的回复:
终极版又是想当然,按一下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这种属性。
开启时代 2012-11-16
  • 打赏
  • 举报
回复
引用 24 楼 Vidor 的回复:
终极版又是想当然,按一下F5先吧。 楼主的意思是非完整周归于上一年最后一周,每年从完整周开始计数。 SQL code?123declare @d datetime = '2011-01-01', @week intselect @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,……
还是你理解力比较强 厉害! 学习了
Vidor 2012-11-16
  • 打赏
  • 举报
回复
终极版又是想当然,按一下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
开启时代 2012-11-16
  • 打赏
  • 举报
回复
那还不简单 接着修改: 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))+'周' 这次应该是终极版了,多谢楼上提醒。
Vidor 2012-11-16
  • 打赏
  • 举报
回复
引用 19 楼 lixzhong 的回复:
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。
加载更多回复(21)

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧