2014-07-16 8 views
1

인사말 StackOverflow 마법사.TSQL "시드"날짜에서 다른 모든 금요일 결정

SQL datetime 계산은 항상 문제를 일으 킵니다. 나는 그 직원의 고용인이 그 달의 마지막 봉급 날과 다음 달 첫날 사이에 떨어 졌는지 알아 내려고합니다. 나는 1970년 1월 2일이 월급 날이었다 알고

    • 나는 우리의 봉급은 다른 모든 금요일 알고, 그 날짜 :.. (즉, 그들은

      한 과학적 자신의 고용 달에 월급을받을 않았다 우리가 가지고있는 가장 긴 활성 직원 앞에. 나는 각 활성 직원의 고용 날짜를 알고

    • 을 (테이블에서 가져온). 내가 아는
    • 을 날짜를 고용.
    • 다음 달 중 첫 번째 (계산할 수 있습니다)

    내가 머리를 감싸고있는 것처럼 보일 수없는 것은 고용 날짜와 고용 날짜 사이에 지불 날짜가 있는지 결정하기 위해 해당 날짜 (1970 년 1 월 1 일)와 함께 datediff, dateadd, datepart 등을 사용하는 방법입니다. 질문과 다음 달 초. 나는 알고있다,

    declare @seedDate datetime = '01/02/1970' -- Friday - Payday seed date from which to calculate 
    declare @hireDate datetime = '09/26/2008' -- this date will actually be pulled from ServiceTotal table 
    declare @firstOfMonth datetime = DATEADD(MONTH, DATEDIFF(MONTH, 0, @hireDate) + 1, 0) -- the first of the month following @hireDate 
    declare @priorPayDate datetime -- calculate the friday payday immediately prior to @firstOfMonth 
    
    
    if @priorPayDate BETWEEN @hireDate AND @firstOfMonth 
        begin 
         -- do this 
        end 
    else 
        begin 
         -- do that 
        end 
    

    을 위의 하드 코딩 된 @hireDate을 사용하여, 모든 - 기타 - 금요일 봉급을 결정하는 @seedDate :

    의사 코드에서

    은, 여기에 내가 할 노력하고있어입니다 2008 년 9 월 19 일에 월급 날이 있었고 2008 년 10 월 3 일까지 또 다른 월급 날이 없었기 때문에 위의 부울은 거짓 일 것이고 나는 이것을 "할 것"이라고 말했습니다. @priorPayDate의 가치는 어떻게 결정합니까?

  • 답변

    1

    @seedDate와 @firstOfMonth 사이의 일 동안 DATEDIFF을 사용하면 총 지급 일수가 주어지며, 마지막 지급 기간에서 (으) 로의 일수를 얻으려면 지불 기간 사이의 일수로 modulus을 사용할 수 있습니다. @firstOfMonth. 1이 필요한 CASE 성명을 월급 날 (예 : 다음 달) 일 때 당신은 문제로 실행하겠습니다 :

    내가 정말하고 싶지 않더라도, 내 마음이 향하는 곳이다
    DECLARE @priorPayDate DATETIME 
    SET @priorPayDate = CASE 
             WHEN DATEDIFF(dd, @seedDate, @firstOfMonth) % 14 = 0 
             THEN DATEADD(dd, -14, @firstOfMonth) 
             ELSE DATEADD(dd, -(DATEDIFF(dd, @seedDate, @firstOfMonth) % 14), @firstOfMonth) 
            END 
    
    +0

    stubaker,이 작업은 아름답게 작동합니다. 나는 당신이 내게 곤란을 겪었던 것에 대해 마음을 감싸 준 것에 대해 감사를 표할 수 없다. – DJGray

    2

    날짜가 많은 곳에서 날짜, 요일, 요일, 월, 주, 월 등의 열이있는 테이블을 만드는 모든 데이터베이스에서 프로 시저 프로그래밍 언어 또는 묶음을 사용합니다. 1970 년부터 2200 년까지 매일이 테이블을 채우기 위해 수기 SQL을 작성했습니다.

    이 테이블을 100 % 압축하여 많이 색인합니다. 그런 다음이 테이블에 날짜를 간단히 가입시키고 간단한 where 절로 복잡한 날짜를 처리 할 수 ​​있습니다. 따라서 기본적으로 헬퍼 테이블을 미리 계산합니다. 어쩌면 당신은 시드 칼럼 이후로 friday를 가진 날짜 도우미 테이블에 칼럼을 추가 할 것입니다.

    희망이 맞는 것입니다.

    +0

    그런 식으로. 나는 stubaker의 제안을 나를 위해 만들 수 없다면 여전히해야 할 수도 있습니다. 관대하게 chiming 주셔서 감사합니다! – DJGray