2017-10-12 78 views
1

我有一個查詢將周和年轉換爲日期。 但它會返回確切的日期。從周和年獲取日期 - 日期必須是一年中的第一天 - sql

但我想是的,我需要日期爲這樣的一天,那就是像當年的第一天。

dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4 - 
datepart(dw, dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4) + 1 

假設的例子。 我當前查詢的作用是: 如果本週是4和2017年,返回26日 - 2017年

我需要: 如果本週是4,2017年和1月1日是一個星期三,它應該返回29日-2017。

希望你們得到什麼,我試圖解釋。

我需要查詢返回擁有的同一天作爲本年度的第一天這樣的日子。

+0

可以共享表的結構和一些樣本數據,以及作爲供試品數據所需的輸出?目前尚不清楚你在這裏做什麼。 –

回答

-1

除非我讀這個錯誤,否則你對自己做的事情太難了。只是這樣做:

declare @year int; set @year = 2017; 
declare @week int; set @week = 4; 

select dateadd(week, @week, dateadd(year, @year - 1900, 0)) 

結果:

2017-01-29 00:00:00.000

dateadd()給你所要求的年度(1月1日)的第一天,不分工作日。如果是星期三,你會得到一個星期三。今年是星期天。外面的dateadd()然後增加了整整幾個星期,所以你最終在一週的同一天,就像你問。

如果這不是你想要的,請解釋它是如何需要更加複雜。

+0

兄弟,我不知道誰給你負回購,但這是我需要的解決方案。輝煌!謝謝 – Doosu

+0

我不擅長日期功能。可悲的。非常感謝 – Doosu

0

如果您有日曆表,這很容易。日曆表是包含給定範圍的每個日期及其部分的表格。我創建礦爲2010年至2020年,此代碼:

declare @start_dt as date = '1/1/2010';  
declare @end_dt as date = '1/1/2020';  

declare @dates as table (
date_id date primary key, 
date_year smallint, 
date_month tinyint, 
date_day tinyint, 
weekday_id tinyint, 
weekday_nm varchar(10), 
month_nm varchar(10), 
day_of_year smallint, 
quarter_id tinyint, 
first_day_of_month date, 
last_day_of_month date, 
start_dts datetime, 
end_dts datetime 
) 

while @start_dt < @end_dt 
begin 
    insert into @dates(
     date_id, date_year, date_month, date_day, 
     weekday_id, weekday_nm, month_nm, day_of_year, quarter_id, 
     first_day_of_month, last_day_of_month, 
     start_dts, end_dts 
    ) 
    values(
     @start_dt, year(@start_dt), month(@start_dt), day(@start_dt), 
     datepart(weekday, @start_dt), datename(weekday, @start_dt), datename(month, @start_dt), datepart(dayofyear, @start_dt), datepart(quarter, @start_dt), 
     dateadd(day,-(day(@start_dt)-1),@start_dt), dateadd(day,-(day(dateadd(month,1,@start_dt))),dateadd(month,1,@start_dt)), 
     cast(@start_dt as datetime), dateadd(second,-1,cast(dateadd(day, 1, @start_dt) as datetime)) 
    ) 
    set @start_dt = dateadd(day, 1, @start_dt) 
end 

select * 
into Calendar 
from @dates 

一旦你有,你可以在PromisedWeek

declare @PromisedYear as numeric 
declare @PromisedWeek as int 

set @PromisedYear = 2017 
set @PromisedWeek = 4 

select concat(date_day, '-', weekday_nm, '-', @PromisedYear) 
from Calendar as c 
where 
    weekday_id = 
     (select weekday_ID 
     from Calendar 
     where date_year = @PromisedYear 
      and day_of_year = 1 
     ) 
    and datepart(week, date_id) = @PromisedWeek 
    and date_year = @PromisedYear 

查詢正確的工作日日曆表原來,2017年1月1日是一個星期天並在2017年第4個星期日爲1月22日,這樣的回報是22-Sunday-2017

相關問題