语句是select DatePart(ww,getdate())
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]])
但是一直报错用不了。
求助啊!%>_<%
默认一年第一周是1月1日所在周,我想取第一个FullWeek为第一周,该怎么设置?
网上查到DatePart(interval, date[,firstdayofweek[, firstweekofyear]])
但是一直报错用不了。
求助啊!%>_<%
解决方案 »
- 如何查找出几个不同表中相同字段名(类型也相同)的所有数据?例如......
- 删除A表里的信息,在B表里用不到的
- 一个关于VPF 查找替换的问题 VPF区没有人 不好意思在这发一下。
- case when else end 的疑问
- 怎样对表的访问量进行统计分析
- 有些难度的问题(BOM多级展开)
- 怎样在SQL Server中实现ORACLE的以下语句Create table tt1 as select * from tt2;
- 求在企业管理器里收缩某数据库日志的代码
- 如何查看日志文件的内容
- 数据库经典难题:请进。
- 存储过程里多条件判断怎么写?紧急中
- sqlWeb.exe[3808]中发生未处理的win32异常,急
举例子就是
select DatePart(ww,'2013-1-6')
这句执行的结果是2,我想得到1。
这样?
那如果是2012年呢?
每一年的起始周不一样。
我想设置成每年第一个周都是整周。
不知道我有没有表达清楚。select DatePart(ww,'2013-1-1')得到的结果是1,但是在我的观念里他应该是53(属于去年最后一周)。
我觉得你应该是明白了,有办法吗?
http://baike.baidu.com/view/327452.htm
这里面给的语法不能用啊。
select datepart(ww, @d) - sign(datepart(dw,datename(year,@d))-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.
--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
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))+'周'
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))+'周'
这次应该是终极版了,多谢楼上提醒。
select @d-=datepart(weekday,@d)-1, @week=datepart(ww,@d)-sign(datepart(dw,datename(year,@d))-1)
select @week
难道sql server没有默认属性可以设置么?
用set DateFirst 1可以设置一周的第一天为周几,为什么没有类似FirstWeekOfYear这种属性。
请参考我的博客
http://blog.csdn.net/tanleittl/article/details/7933693
你要用ISOWEEK,为什么不直接
select DATEPART(ISOWK,'2012-12-31')?我要的也不是ISOWEEK,是每年的第一个周日所在周为第一周,每周第一天是星期天。
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')--53when 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)+1else DATEDIFF(WK,@yearFirstDay,@date) --如果是,则1月1号所在周为第一周
end as week --否则,1月1号属于去年最后一周我写了段实现了我的需求,看起来有点复杂,我相信没多少人看得进去,因为我自己都不愿意看这么复杂的代码的。
之所以没用大家建议的,是因为我不想写存储过程,我写的这个可以直接作为字段用。
写的时候我也觉得这需求太蹩脚了,为什么不能直接用isoweek,但是没办法,之前统计数据库的时候都是用的这个规则,也不能因为我一个人的想法而改变。
我觉得之前之所以会用这一套,是因为在c#里面可以直接指定规则,太方便了,所以没人考虑sql server该怎么办,反正用代码。忽然感觉好悲伤好无力!自己不想绕道用c#写同步程序,结果又不能自如的运用sql server。
所以希望大家以后写程序用什么规则的时候一定要谨慎考虑啊T_T。
凭这句可以明确告诉你,你写的是错的,也是想当然lastYear一定是完整周开始的。既然不采用别人的建议,我也懒得跟你说我的思路。
嗯,这个比我的简单好多好多,但是我是想直接用在字段中,就是select表的时候就能直接得出结果。
而且,周开始日为周一,与你要的周日不符
规定就是规定,是为了统一标准而大家约定的规范,如果ISO周的定义就是:年份Y的第一周是Y年1月4号所在的周。我如何能够解释呢
就拿2013年来说,1月4号是属于2012年的最后一周。
你这句话,就已经遵循了某一准则
例如:你这里提出的 1月7号所在的周就是第一周,而每一周的第一天是星期天。你的概念似乎非常的混淆