2009-10-14 5 views
1
내가 년 개월에서 시작 날짜가 그 주 내에서 특정 날짜에 특정 주에 무엇을 해결해야 할

.. 특정 주에 특정 일의 날짜를 가져옵니다</p> <p>즉

년 : 2009 달 : 10 주 : 5 일-수 : 0

반환 2009년 10월 25일 일요일입니다 0시 0분 0초. 5 주 공지 사항에 따르면 2009-10 년도에는 5 주째에 0 일이 없습니다. 2009-11-01 00:00:00 ... 일주일은 주어진 주간의 마지막 가능한 날짜를 항상 반환합니다. 당신은 내가 공정 해요 경우 꽤 미쳤다는 C 구조체 TIME_ZONE_INFORMATION (link text) 덤비는거야 이미 짐작 havn't는 경우 해당 월의 일 ..

...

날짜 수학 및 SQL 존경받을 무언가, 슬프게도 그 무언가 나는 정말로 스트립 시간을 넘어 깊이 파고 들어 본 적이 없습니다. 어떤 도움이 크게 appriciated 것입니다.

PS : MSSQL 2005 BTW ..

+0

당신은 일 및 월이 있습니다 - 수행해야 할 계산은 주 및 일 수에 대한 것입니다. –

답변

0

당신이 T-SQL 저장 프로 시저를 사용할 수 있습니까? 그렇다면 DATEPART이 사용할 함수입니다. 일요일 = 1, 토요일 = 7 평일 날짜 부분이 에 따라 에 의해 생성 된 수 : 예를 들어, 의 요일에 해당하는 수를 반환 날짜 부분

요일 (DW) SET DATEFIRST에 의해 설정된 값으로 을 첫 번째 요일로 설정합니다.

+0

네, SQL 언어는 꽤 간단합니다. 위의 내용은 상당히 진보되어 있으며 날짜를 나타내는 수학을 필요로합니다. MS가 적절한 날짜 : 시간 모델을 구현해서는 안됩니다. –

+0

좋아, 네 질문을 이해하려고 노력 중이야 ... 한 달에 첫 번째 주를 "주 0"이라고 생각하면 맞습니까? 기본적으로 "Year = 2009, Month = 10, Week = 2, Day = 3"을 실제 날짜로 변환 하시겠습니까? 우리가 기본적으로 "캘린더 행"에 대해 말하고 있기 때문에 "주 0"이 7 일 미만일 수 있다고 가정합니다. 맞습니까? – bobbymcr

1

이것은 내 구현이며 완벽하게 작동합니다. SQL datetime (1753 년)에서 요청한 날짜의 첫 번째 발생을 찾고 선택한 연도/월에 첫 번째 발생까지 추가 할 일 수를 계산합니다. 그런 다음 x 주를 해당 날짜에 추가 한 결과를 선택한 테스트 케이스에서 테스트하여 선택한 달 내에 항상 도착하도록합니다.

이것은 SQL 데이터베이스에서 UTC 날짜 : 시간에 대해 생각해 본 사람들에게 매우 유용합니다. '결과의 경과 시간'을 그래프로 표시하고 그 시간이 일광 바이어스를 알고 있고 시작/종료 시점을 알면 몇 개월에 걸쳐 쿼리에 사용할 수없는 정보입니다.

Create function dbo.DST_From_MSStandardDate 
(
@year int, 
@month int, 
@week int, 
@hour int, 

-- Sun = 1, Mon = 2, Tue = 3, Wed = 4 
-- Thu = 5, Fri = 6, Sat = 7 
-- Default to Sunday 
@day int = 1 
) 
/* 
Find the first day matching @day in the month-year 
requested. Then add the number of weeks to a minimum 
of start of the month and maximum of end of the month 
*/ 
returns datetime 
as 
begin 
declare @startPoint  datetime 
declare @finalPoint  datetime 
declare @firstDayInMonth  datetime 
declare @begin_week  datetime 

-- Create the base date 
set @startPoint = dateadd(mm,(@year-1900)* 12 + @month - 1,0) 

-- Check for valid day of week 
if @day between 1 and 7 
begin 
-- Find first day on or after 1753/1/1 (-53690) 
-- matching day of week of @day 
select @begin_week = convert(datetime,-53690+((@day+5)%7)) 
-- Verify beginning of week not before 1753/1/1 
if @startPoint >= @begin_week 
    begin 
    select @firstDayInMonth = dateadd(dd,(datediff(dd,@begin_week,@startPoint)/7)*7,@begin_week) 
    end 
end 

-- Case for an offset, some weeks have 5 weeks, others have 4 weeks. 
set @finalPoint = dateadd(hour,@hour,dateadd(wk,@week- 
case 
    when datepart(month,dateadd(wk,@week,@firstDayInMonth))>@month then 1 -- day lands in the following month 
    when datepart(month,dateadd(wk,@week,@firstDayInMonth))<@month then 0 -- day lands in the proceeding month 
    else 0 
end 
,@firstDayInMonth)) 

return @finalPoint 

end 
go