따라서 조종사는 매 6 개월 (준결승) 및 매년 (연간) 너무 많은 비행 시간과 비행 소총을 얻어야합니다. 가장 큰 고통은이 기간의 시작일과 종료일이 출생 월을 기준으로한다는 것입니다.조종사 생일과 현재 날짜를 기준으로 SQL 날짜를 계산하는 방법
당신은 여기 내 스키마에 대한 자세한 정보를 찾을 수 있습니다 : Design decision: Table schema for partial dates in order to calculate time spans (SQL Server)
DECLARE @date Date
SET @date = '1985-04-12'
DECLARE @diffInYears INT
SET @diffInYears = DATEDIFF(yy, @date, GETDATE())
DECLARE @currentBirthDate Date
SET @currentBirthDate = (SELECT dateadd(yyyy, @diffInYears, @date))
SELECT DATEADD(dd, -DAY(DATEADD(m,1,@currentBirthDate)), DATEADD(m,7,@currentBirthDate)) semiAnnualDateEnd,
DATEADD(dd, -DAY(DATEADD(m,1,@currentBirthDate)), DATEADD(m,13,@currentBirthDate)) annualDateEnd
RESULTS:
semiAnnualDateEnd - annualDateEnd
2012-10-31 - 2013-04-30
지금,이 중대하다,이 내가이 특정 예를 들어 원하는 날짜입니다.
그러나 2012 년 11 월 1 일에 도착하면 semiAnnualDateEnd가 2013-04-30이되기를 바랍니다.
2013 년 1 월 1 일이되면 (2013 년 1 월 1 일) 2013-05-01까지 2013D4-30에 머무르고 싶을 때 annualDateEnd는 2014-04-30이 될 것입니다. 그런 다음 2014-04-30 (semiAnnual의 경우와 비슷한 상황)이됩니다.
저는이 날짜를 특정 조종사와 정적으로 연관 짓기를 원하지 않습니다. 즉, 파일럿 테이블에 이러한 필드가있는 필드를 두 개 유지하고 싶지 않습니다. 그러나, 나는 이것을 디스플레이와 계산에 사용하고 싶다. 예를 들어, 각 조종사의 현재 반년 및 연별 출근과 비행 시간을 표시하고 특정 시점의 "현재"통계를 스냅 샷으로 표시해야 할 필요가 있습니다.
편집 : SQL Server 2008 Express에 RC를 사용하고
편집 2 :. 내가 (SELECT DATEADD (YYYY, @diffInYears에 @currentBirthDate 변경해야합니다 생각하고 있어요 -) @date 1 다음, 나는 (계속 실험)
이번 달 초에 가서 1 일을 뺀다는 의미였습니까? 또한 단지 까다 롭지 만 실제로 varchar (255)로 캐스팅해야합니까?그 해 동안 varchar (4)를 할 수 없었으며 그 달에 (2) 할 수 없었습니까? – Greg
예, 저는이 달 초에 가서 하루를 빼기로했습니다. 이 달의 끝을 찾는 가장 쉬운 방법입니다. varchar의 크기는 충분히 크고 <= 8000이면 쿼리 성능에 아무런 영향을 미치지 않습니다. 특별한 가치는 개인적인 취향의 문제입니다. –