2017-10-12 7 views
1

私は週と年を変換するクエリを持っています。 しかし、正確な日付を返します。週と年から日付を取得 - 日付は年の最初の日でなければなりません -

しかし、私が欲しいのは、そのような日である必要があります、それは年の最初の日と同じです。

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。

あなたが私が説明しようとしていることを願っています。

今年の1日目と同じ日の日付を返すクエリが必要です。

+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

これは、カレンダーテーブルを持っているとかなり簡単です。カレンダーテーブルは、指定された範囲のすべての日付とその部分を含むテーブルです。あなたは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 

に正しい曜日を照会することができますカレンダーのテーブルを持っていたら

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 

1月1日2017年は日曜日だったことが判明:私はこのコードを2020年に2010年に鉱山を作成しました2017年の第4日曜日は1月22日でしたので、返品は22-Sunday-2017

関連する問題