2

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

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

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

4

3 回答 3

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)比今天更小的问题,你可以在这个答案上找到一个很好的解释:

NULL 被 strtotime 解释为 0,因为它想要传递一个整数时间戳。时间戳 0 表示 1970 年 1 月 1 日。

所以它会进入if。

于 2013-11-08T12:26:57.217 回答
1

NULL(或?)是 ABL 中的奇怪生物 - 处理它们的最佳方法是像这样显式测试它们:

IF value_from_db <> ? AND value_from_db > some-date THEN 
    /* do something */ 
ELSE
    /* DO something else. */
于 2013-11-08T12:28:09.640 回答
0

简单地说,任何涉及任何变量的算术比较都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
于 2013-11-10T22:34:32.743 回答