go CREATE FUNCTION fun_date(@year INT, @week INT, @weekday INT)--数据范围@year 1753--9999;@week 1--53;weekday 1--7(Sunday--Saturday) RETURNS DATETIME AS BEGIN DECLARE @date DATETIME--, @year INT, @week INT, @weekday INT declare @i int SET @date = Convert(datetime,(Convert(varchar(4),@year)+'-01-01')) set @i=datepart(weekday,@date) SET @date = dateadd(day,(@week-1)*7,@date) set @date = dateadd(day,(@weekday-1),@date) set @date = @date-@i+1 RETURN @date END go --2007年第10周的周一是几月几号? SELECT dbo.fun_date(2008, 20, 2) drop function fun_date经过测试2008年的也没问题
--试试这个,比较简单 declare @vDate datetime --开始日期 declare @vNumber int --datepart的数字 set @vDate='2007-1-1' set @vNumber=10 select dateadd(ww,datediff(ww,0,@vDate)+@vNumber,0) --0被SQL Server 系统默认为:1900-01-01(星期一),依次类推,这个方法也比较实用,推荐楼主看下
select dateadd(day,12,getdate())
SELECT DATEADD(DAY, 10 * 7, 2007-1-1)
-- 得到了几月几号之后,再加成12天后,又是几月几号
SELECT DATEADD(DAY, 12, DATEADD(DAY, 10 * 7, 2007-1-1))
----2007年第10周的周一是几月几号
select dateadd(week,10,'2009-01-01')
----得到了几月几号之后,再加成12天后,又是几月几号?
select dateadd(day,12,dateadd(week,10,'2009-01-01'))/*
结果1:
2009-03-12 00:00:00.000结果2:
2009-03-24 00:00:00.000
*/
services 港口 到港 离港 SI截关 CY截关 TT(所需天数)
c1 香港 周日 周日 周五 周六
c1 他科马 周五 周六 12
c1 奥克兰 周一 周二 15
c1 檀香山 周六 周日 20
c1 关岛 周二 周三 30
表:t2
Services 年份 第几周
c1 2007 34
c1 2008 34要得到这样的结果: 香港 到港时间
services 年份 第几周 到港 离港 SI截关 CY截关 他科马 奥克兰 檀香山 关岛
c1 2007 34 8-19 8-19 8-24 8-25 8-31 9-3 9-8 9-13
c1 2008 34 ? ?..............................................
..
..也就是说:在t1中已经有了周几和TT(例如:从香港到他科马需要12天),
在t2中有对应的services,然后通过年份和给出的第几周,来得到那样的结果.
例如:上面的,从香港到他科马需要12天,那么我要得到:2007年,第34周,
到他科马是几月几日?http://community.csdn.net/Expert/topic/5723/5723453.xml?temp=.7266504
set datefirst 1
----2007年第10周的周一是几月几号
select dateadd(week,10,'2007-01-01')
----得到了几月几号之后,再加成12天后,又是几月几号?
select dateadd(day,12,dateadd(week,10,'2007-01-01'))/*
结果1:
2007-03-12 00:00:00.000结果2:
2007-03-24 00:00:00.000
*/
先用LS大大的方法得到日期,然后截断用substring
表联合用 left jion 就可以了
看你发了那么多贴LZ辛苦了
----2007年第10周的周一是几月几号
select dateadd(week,10,'2007-01-01')
--------------------------------------------------------
上面这个计算的结果只是2007年第10周是几月几号,但不一定就是星期一,更正一下:
select dateadd(day,-(datepart(weekday,dateadd(week,10,'2007-01-01')) - 1),dateadd(week,10,'2007-01-01'))/*结果
2007-03-12 00:00:00.000
*/
RETURNS DATETIME
AS
BEGIN
DECLARE @date DATETIME--, @year INT, @week INT, @weekday INT
SET @date = RTRIM(@year)+'-1-1'
SET @date = @date + (@week-1)*7 + @weekday - 2
RETURN @date
END--2007年第10周的周一是几月几号?
SELECT dbo.fun_date(2007, 10, 2)-----------------------
2007-03-05 00:00:00.000(1 行受影响)
--得到了几月几号之后,再加成12天后,又是几月几号?
SELECT dbo.fun_date(2007, 10, 2) + 12-----------------------
2007-03-17 00:00:00.000(1 行受影响)
--2008年,第20周,周二.
SELECT dbo.fun_date(2008, 20, 3)-----------------------
2008-05-14 00:00:00.000(1 行受影响)
@year年 例:2007
@week周数 例:10
@weekday星期 例:周一
数据范围@year 1753--9999;@week 1--53;weekday 1--7(Sunday--Saturday)a.将@year 转换成:2007-1-1
b.将2007-1-1 + (10-1)*7 + 2 - 2
上面的'-1'和'-2'是我加的权值,问题很有可能出在这里!
c.函数返回正确日期:2007-03-05 00:00:00.000
哪位还有更好的方法?
可能是SQL Server里边提供的方法就是把01月01日做为星期一来计算的
go
CREATE FUNCTION fun_date(@year INT, @week INT, @weekday INT)--数据范围@year 1753--9999;@week 1--53;weekday 1--7(Sunday--Saturday)
RETURNS DATETIME
AS
BEGIN
DECLARE @date DATETIME--, @year INT, @week INT, @weekday INT
declare @i int
SET @date = Convert(datetime,(Convert(varchar(4),@year)+'-01-01'))
set @i=datepart(weekday,@date) SET @date = dateadd(day,(@week-1)*7,@date)
set @date = dateadd(day,(@weekday-1),@date)
set @date = @date-@i+1
RETURN @date
END
go
--2007年第10周的周一是几月几号?
SELECT dbo.fun_date(2008, 20, 2)
drop function fun_date经过测试2008年的也没问题
不过我用了您的代码还是没有解决楼主那个开船的问题,好长,我好弱~厄~
declare @vDate datetime --开始日期
declare @vNumber int --datepart的数字
set @vDate='2007-1-1'
set @vNumber=10
select dateadd(ww,datediff(ww,0,@vDate)+@vNumber,0)
--0被SQL Server 系统默认为:1900-01-01(星期一),依次类推,这个方法也比较实用,推荐楼主看下