2014-07-16 3 views
1

Приветствия StackOverflow Wizards.TSQL Определите каждую пятницу с «семенной» даты

SQL datetime вычисления всегда дают мне проблемы. Я пытаюсь определить, упал ли наемный работник сотрудника между последней зарплатой этого месяца и первым в следующем месяце. (Т.е. они получают зарплату в их прокатном месяце

Knowns:.

  • Я знаю, что наши выплаты зарплат являются каждой пятницей
  • Я знаю, 01/02/1970 был Payday, и эта дата. предшествует длинный активный работник у нас есть.
  • Я знаю дату прокатной каждого активного работника (вытянут из таблицы).
  • Я знаю, (можно вычислить) первое число месяца, следующего за аренду даты.

Возможно, я не могу склонить голову, чтобы использовать дату посева (01/02/1970) с датой, датой, датой и т. Д., Чтобы определить, существует ли дата оплаты между датой найма в вопрос и первый из следующего месяца.

В псевдокоде, вот что я пытаюсь сделать:

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 определить каждый-другой-пятница выплаты зарплаты, я знаю, что день выплаты жалованья был 9/19/2008, а не один до 10/03/2008, поэтому логическое значение выше было бы ЛОЖНЫМ, и я буду «делать это», а не «делать это». Как определить значение @priorPayDate?

ответ

1

Принимая DATEDIFF в течение нескольких дней между вашим @seedDate и @firstOfMonth даст вам общее количество дней, которые вы можете modulus на количество дней между периодами оплаты (14), чтобы получить количество дней с последнего периода оплаты до @firstOfMonth. Вы столкнетесь с проблемами, когда первый является получки (например, в следующем месяце), что делает 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

Во всех моих базах данных, где много происходит с датами, я создаю таблицу с колонками для даты, дня, дня недели, месяца, недели, дня месяца и т. Д. И т. Д. Затем я использую процедурный язык программирования или связку рукописного sql, чтобы заполнить эту таблицу каждый день в течение большого диапазона лет с 1970 по 2200.

Я упаковываю эту таблицу на 100% и сильно индексирую ее. Затем вы можете просто присоединить любую дату к этой таблице и сделать сложный материал даты простым предложением where. Поэтому в основном вы предварительно вычисляете вспомогательную таблицу. возможно, в вашем случае вы добавляете столбец в таблицу помощников даты с понедельника с семенного столбца.

желающий это имеет смысл.

+0

Вот где мой ум возглавляли, хотя я действительно не хочу, чтобы это сделать сюда. Мне все равно придется, если я не смогу сделать предложение для стубикера для меня. Спасибо, что щедро возились! – DJGray

Смежные вопросы