与4gl中的NULL值和日期进行比较

时间:2013-11-08 11:50:56

标签: php database date informix 4gl

我有一个来自数据库的值,这是informix中的日期。有时这个值将为null,否则它将是一个日期。我正在将该值与今天的日期进行比较,如下所示。

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

这里的输出是什么。它会打印Todays greaterTodays 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

我很困惑。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

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)小于今天的问题,您可以在this answer找到一个很好的解释:

  

由strtotime将NULL解释为0,因为它希望传递给它   整数时间戳。时间戳0表示1-1-1970。

所以它会进入if。

答案 1 :(得分:1)

NULL(或?)是ABL中的奇怪生物 - 处理它们的最佳方法是明确地测试它们:

IF value_from_db <> ? AND value_from_db > some-date THEN 
    /* do something */ 
ELSE
    /* DO something else. */

答案 2 :(得分:0)

简而言之,所涉及的任何变量NULL的任何算术比较都将导致false,这意味着您当前形式的代码将逐渐转移到ELSE子句。< / p>

您需要明确测试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