我有一个来自数据库的值,这是informix中的日期。有时这个值将为null,否则它将是一个日期。我正在将该值与今天的日期进行比较,如下所示。
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
我很困惑。非常感谢任何帮助。
答案 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