1 (edited by Inkalika 2020-07-11 19:54:11)

Topic: Подстановка даты при его нулевом значении через запрос SQL

Столкнулся со следующей ситуацией в своем примере.
Ранее я хотел получить дату последнего статуса прибора Card. Получил.
Но если у меня прибор был только занесен в базу и еще нет у него статусов. В этом случае я получаю ошибку при формировании этой даты.
Чтобы избавиться от этого, решил, что надо внести дополнительную проверку функцией ifnull, но у меня она не работает.
Вот такой запрос работает: FrmCard.DateTimePicker2.Date:=SQLDateTimeToDateTime(SQLexecute('SELECT date (ifnull(''2020-05-25'',''2019-01-31''))'));
Или FrmCard.Edit2.Text:=SQLexecute('SELECT date(ifnull(''2020-05-25'', "2019-01-31"))');
А вот такой нет: FrmCard.DateTimePicker2.Date:=SQLDateTimeToDateTime(SQLexecute('SELECT date(ifnull(date,''2019-01-31'')) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1'));
Или FrmCard.Edit2.Text:=SQLexecute('SELECT date(ifnull(date, "2019-01-31")) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1');

В первом случая я выбираю из 2-х дат, во втором случае из запроса и даты.
Скажите, что неверно в синтаксисе использования ifnull?
В примере демонстрация для Card под именем 2.

Post's attachments

Attachment icon Тест.rar 295.26 kb, 231 downloads since 2020-07-11 

2 (edited by sibprogsistem 2020-07-11 21:55:43)

Re: Подстановка даты при его нулевом значении через запрос SQL

date(ifnull(date,''2019-01-31''))
Замените на
ifnull(date,''2019-01-31'')

 Form1.Edit1.Text:=SQLexecute('SELECT IFNULL(date,"2019-01-31") FROM status WHERE id=1'); 

поле из которого берете значение пишется в скобках функции  IFNULL

Re: Подстановка даты при его нулевом значении через запрос SQL

Не сработало. На втором Card не подставляет дату при пустом Status.
Функцию Date я использовал, чтобы оставить от даты/времени только дату.

Re: Подстановка даты при его нулевом значении через запрос SQL

Inkalika wrote:

Не сработало. На втором Card не подставляет дату при пустом Status.
Функцию Date я использовал, чтобы оставить от даты/времени только дату.

сделал все то же самое на обычном запросе

Form1.Edit1.Text:=SQLexecute('SELECT date(ifnull(date,"2019-01-31")) FROM status WHERE id=1');
  Form1.DateTimePicker1.DateTime:=SQLDateTimeToDateTime(SQLexecute('SELECT date(ifnull(date,"2019-01-31")) FROM status WHERE id=1'));

все работает
потом удалил все записи и получил Вашу ошибку
дело в том, что когда по Вашему запросу формируется таблица, в нее не отбираются записи, их попросту нет...
то есть id=0....

if SQLexecute('SELECT COUNT(id) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1') then
    FrmCard.DateTimePicker2.DateTime:=SQLDateTimeToDateTime(SQLexecute('SELECT date(ifnull(date,"2020-07-07")) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1')) else
    showmessage('пусто');

5 (edited by Inkalika 2020-07-12 15:14:23)

Re: Подстановка даты при его нулевом значении через запрос SQL

sibprogsistem wrote:

дело в том, что когда по Вашему запросу формируется таблица, в нее не отбираются записи, их попросту нет...
то есть id=0....

if SQLexecute('SELECT COUNT(id) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1') then
    FrmCard.DateTimePicker2.DateTime:=SQLDateTimeToDateTime(SQLexecute('SELECT date(ifnull(date,"2020-07-07")) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1')) else
    showmessage('пусто');

Понял. Спасибо за помощь!
Думал, что и в случае, когда NULL возвращается, и когда id=0, будет одинаково работать функция IFNULL, а  оказывается нет.
Поправил для себя вот так:

if SQLexecute('SELECT COUNT(id) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1')
then FrmCard.DateTimePicker2.DateTime:=SQLDateTimeToDateTime(SQLexecute('SELECT date(date) FROM status WHERE status.id_card='+ FrmCard_Full.TableGrid1.sqlValue +' ORDER BY date DESC LIMIT 1'))
else FrmCard.DateTimePicker2.DateTime:=SQLDateTimeToDateTime(SQLexecute('SELECT date("2019-07-07")'));