2017-01-20 5 views
1

Как добавить в «диапазон лет» к моему заявлению ниже? Мне просто нужно исправить «INTERVAL 6 YEAR» & «INTERVAL 5 YEAR».Как добавить в «диапазон лет» к моему изложению дел

Здесь критерии мне нужно моделировать:

Если 1 ~ 5 лет, а затем 11

Если 6 ~ 10 лет, а затем 14

Если 11+ лет, а затем 18

CASE WHEN hiredate < DATE_SUB(NOW(),INTERVAL 11 YEAR) 
THEN '18' 
WHEN hiredate < DATE_SUB(NOW(),INTERVAL 6 YEAR) 
THEN '14' 
WHEN hiredate < DATE_SUB(NOW(),INTERVAL 5 YEAR) 
THEN '11' 
ELSE '0' END AS Non_Management_Accrual 
+0

Измените 'INTERVAL 5 YEAR' на' INTERVAL 1 YEAR'. – Barmar

ответ

1

Метод DATEDIFF Чтобы рассчитать количество дней между двумя днями и разделить его на 365, чтобы получить years. Исходя из этого, вы можете подправить case заявление, например .:

SELECT id, CASE WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) < 1 
THEN '0' 
WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) < 6 
THEN '11' 
WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) < 11 
THEN '14' 
ELSE '18'  
END AS Non_Management_Accrual 
FROM emp; 

Вот SQL Fiddle.

+0

Спасибо за ответы! – jlig

+0

Помогло ли вам решить вашу проблему? –

+0

Даршан, глядя на него с точки зрения дня, даст мне больше вариантов в будущем, и отлично работает! Еще один вопрос: мне может понадобиться второй оператор CASE, если сотрудник является Менеджером (если 1-5 лет, затем 14 и если 6+ лет, то 18) - Я храню поле в тех же tblUsers, что и «reportsToID ", который является идентификатором Менеджера. – jlig

0

Darshan, я закончил создание Views на стороне MySQL, а затем добавил представление в инструкцию FROM вашего кода выше. Это дало мне правильный результат. Благодарю.

<!--- Create the Manager Monthly Accruals (Mgt) dataset ---> 
    <cfquery name="rsLeaveTimeManagerAccruals" datasource="care"> 
SELECT username, status, active, email, hiredate, tblUsers.picture AS eP 
, TIMESTAMPDIFF(YEAR, hiredate, NOW()) AS year_passed 
, TIMESTAMPDIFF(MONTH, hiredate, NOW()) MOD 12 AS month_passed 
, TIMESTAMPDIFF(DAY, hiredate, NOW()) MOD 365 AS day_passed 
, CONCAT(TIMESTAMPDIFF(YEAR, hiredate, NOW())," years, ",TIMESTAMPDIFF(MONTH, hiredate, NOW()) MOD 12," months, ",TIMESTAMPDIFF(DAY, hiredate, NOW()) MOD 365," days") AS EmployLengthActive 
, TIMESTAMPDIFF(YEAR, hiredate, NOW()) AS monthly_accrual_time 

, CASE WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) < 1 
THEN '0' 
WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) <= 5 
THEN '14' 
WHEN FLOOR(DATEDIFF(NOW(), hiredate)/365) >= 6 
THEN '18' 
END AS Management_Accrual 


FROM  v_reports_to_mgt_list LEFT OUTER JOIN tblusers ON tblusers.ID = v_reports_to_mgt_list.id 
WHERE  clr_accrual = '1' AND hiredate IS NOT NULL 
ORDER BY hiredate 
</cfquery> 
+0

Еще одна вещь: как изменить эту строку на «2 месяца» вместо «1 год»? «КОГДА ЭТАЖ (DATEIFF (СЕЙЧАС(), нанято)/365) <1 THEN '0' – jlig

+0

@DarshanMehta, Еще одна вещь: Как изменить эту строку на« 2 месяца »вместо« 1 год »?» КОГДА FLOOR (DATEDIFF (NOW(), нанято)/365) <1 THEN '0' – jlig

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