Сравнение со значением NULL и датой в 4gl

У меня есть значение, поступающее из базы данных, которое является датой в informix. Иногда это значение будет нулевым, иначе это будет дата. Я сравниваю это значение с сегодняшней датой, как показано ниже.

if(value_from_db <= todays_date){
  //display Todays greater
}
else{
  //Display Todays smaller
}

Что будет здесь выводиться. Он будет печатать Todays greater или Todays smaller Мой вопрос в том, что если value_from_db is NULL будет он входит в условие if или внутри условия else. Я нашел что-то в этом, что описано как

Поле даты получает значение NULL. Если я использую FOR EACH даже меньше или больше, чем дата пользователя, появляется эта запись поля NULL. Кажется, что NULL больше, чем все другие даты, и в то же время меньше, чем все другие даты.

Если поле, в котором хранится значение NULL, является компонентом индекса, значения NULL сортируются по старшинству.

Мне нужно преобразовать это в php, но после анализа правильного o/p. В случае php

if(strtotime(NULL) <= time())
  echo 'Todays greater';
else
  echo 'Today is smaller';

Это выведет

Todays greater

Я в замешательстве. Любая помощь очень ценится.


person Deepu    schedule 08.11.2013    source источник
comment
Я уже видел разные ситуации, когда значение NULL имеет разную обработку, поэтому вы никогда не можете доверять значению NULL. Правильный способ работы с ним — проверить его явным образом или установить какое-либо ограничение, гарантирующее, что вы никогда его не получите. В базе данных И 4GL правильный оператор для проверки NULL: <variable/field> IS NULL. ВАЖНО никогда не используйте равные <variable/field> = NULL это не работает! Для PHP у вас есть функция is_null()   -  person ceinmart    schedule 09.11.2013


Ответы (3)


Он введет ELSE либо вы сделаете <= todays_date, либо >= todays_date, поскольку NULL не больше и не меньше.

У вас должно быть что-то в запросе, который подпитывает это value_from_db, чтобы не возвращать вам значения NULL ИЛИ проверять их специально для них в IF.

Вот процедура, чтобы проверить это:

CREATE TABLE datet(date1 DATE);
INSERT INTO datet VALUES(null);

CREATE PROCEDURE validateNullDate()
    RETURNING char(5)

    DEFINE dateVar DATE;

    SELECT date1 INTO dateVar FROM datet;

    IF dateVar <= TODAY THEN
        RETURN "if";
    ELSE
        RETURN "else";
    END IF
END PROCEDURE;

Даже изменение IF на: IF dateVar >= TODAY THEN. Вы всегда получите «еще».

РЕДАКТИРОВАТЬ:

Что касается вашего вопроса о том, чтобы сделать strtotime(NULL) меньше, чем сегодня, вы можете найти хорошее объяснение в этом ответе:

NULL интерпретируется strtotime как 0, так как ему нужно передать целочисленную отметку времени. Отметка времени 0 означает 1-1-1970.

Так что это пойдет в если.

person Filipe Silva    schedule 08.11.2013
comment
Спасибо за ваш ответ. Итак, вы говорите, что если value_from_db не содержит дату, она всегда будет входить в случай else.? - person Deepu; 08.11.2013
comment
да. Если вы хотите, чтобы он вошел в IF, вы должны добавить проверку на наличие нулей в IF. - person Filipe Silva; 08.11.2013

NULL (или ?) — странные создания в ABL. Лучший способ справиться с ними — это явно протестировать их следующим образом:

IF value_from_db <> ? AND value_from_db > some-date THEN 
    /* do something */ 
ELSE
    /* DO something else. */
person Tim Kuehn    schedule 08.11.2013

Проще говоря, любое арифметическое сравнение, в котором любая из задействованных переменных имеет значение NULL, даст результат false, что означает, что ваш код в его текущей форме попадает в предложение ELSE.

Вам нужно явно протестировать NULL, например.

IF value_from_db IS NULL THEN
    /* display date is unknown */
ELSIF value_from_db <= TODAY THEN
    /* display date is in the past */
ELSE
    /* display date is in the future */
END IF;

Порядок тестирования не очень важен в вашем примере. Вы также можете написать это как

IF value_from_db <= TODAY THEN
    /* display date is in the past */
ELSIF value_from_db > TODAY THEN
    /* display date is in the future */
ELSE
    /* display date must be null */
END IF
person RET    schedule 10.11.2013