2015-12-30 4 views
1

я получил следующий SQL QueryDATEDIFF - Заменить NULL с NOW()

SELECT 
    e.id, 
    c.name, 
    e.location, 
    e.designation, 
    e.time_period_from, 
    e.time_period_to, 
    DATEDIFF(e.time_period_to, time_period_from) AS tenure_in_days 
FROM 
    employment e 
LEFT JOIN 
    company c ON (c.id = e.company_id) 
LIMIT 
    0, 10 

Это прекрасно работает, у меня есть сценарий, где time_period_to может иметь NULL значения, в этом случае, я хочу, чтобы заменить его с током Дата.

Вот что я пробовал.

SELECT 
    e.id, 
    c.name, 
    e.location, 
    e.designation, 
    e.time_period_from, 
    e.time_period_to, 
    DATEDIFF(IF(ISNULL(e.time_period_to), NOW(), e.time_period_from)) AS tenure_in_days 
FROM 
    employment e 
LEFT JOIN 
    company c ON (c.id = e.company_id) 
LIMIT 
    0, 10 

Это дает мне следующее сообщение об ошибке

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'DATEDIFF' 

Где я буду неправильно?

+1

'DATEDIFF (e.time_period_to, time_period_to)' - - это всегда будет '0', так как вы вычитаете время из себя. – Barmar

+0

Нет, он возвращает мне NULL –

+1

Он вернет 'NULL', если столбец' NULL'. Но когда столбец заполнен, он вернет 0, потому что вы вычитаете столбец из себя. – Barmar

ответ

2

Использование COALESCE вместо:

SELECT 
    e.id, 
    c.name, 
    e.location, 
    e.designation, 
    e.time_period_from, 
    e.time_period_to, 
    DATEDIFF(COALESCE(e.time_period_to, NOW()), e.time_period_from) AS tenure_in_days 
FROM employment e 
LEFT JOIN company c ON (c.id = e.company_id) 
LIMIT 0, 10 

Я предполагаю, что вы хотели DATEDIFF(e.time_period_to, e.time_period_from).

Использование LIMIT без явного ORDER BY может возвращать результат в зависимости от плана выполнения.

+0

Я хотел напротив 'DATEDIFF (e.time_period_to, e.time_period_from)' позвольте мне проверить это. –

+0

@IbrahimAzharArmar Легко исправить, просто замените суффиксы '_from' и' _to'. Позвольте мне узнать ваш окончательный запрос. – lad2025

+1

, конечно, я уже :-), и он работает, спасибо. –

2

У вас есть скобки в неправильном месте. Вместо указания e.time_period_from в качестве второго аргумента DATEDIFF у вас есть третий аргумент IF. Оно должно быть:

DATEDIFF(IF(ISNULL(e.time_period_to), NOW(), e.time_period_to), e.time_period_from) AS tenure_in_days 

Вы также можете использовать IFNULL (который является упрощенной версией COALESCE, и имя более мнемонические):

DATEDIFF(IFNULL(e.time_period_to, NOW()), e.time_period_from) AS tenure_in_days 
+0

Спасибо @Barmar, имеет большой смысл. –

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