[英]Comparison with NULL value and date in 4gl
我有一個來自數據庫的值,它是notifyix中的一個日期。有時這個值將為null否則它將是一個日期。我正在將該值與今天的日期進行比較,如下所示。
if(value_from_db <= todays_date){
//display Todays greater
}
else{
//Display Todays smaller
}
會有什么輸出here.It將打印Todays greater
或Todays smaller
我的問題是,如果value_from_db is NULL
將是不言而喻的,如果條件內或其他condition.I發現一些在此被描述為內部
日期字段獲取NULL值。 如果我使用的FOR EACH小於或大於用戶日期,則會顯示NULL字段記錄。 它似乎比所有其他日期都大NULL,同時比所有其他日期都糟。
如果存儲NULL值的字段是索引組件,則將NULL值排序為高位。
我需要將其轉換為php,但是在分析了正確的o / p之后。
if(strtotime(NULL) <= time())
echo 'Todays greater';
else
echo 'Today is smaller';
這將輸出
Todays greater
我很困惑。非常感謝您的幫助。
您執行<= todays_date
或>= todays_date
都會輸入ELSE
,因為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
。 您將永遠得到“ else”。
編輯:
關於使strtotime(NULL)
小於今天的問題,您可以在此答案上找到很好的解釋:
NULL在strtotime時解釋為0,因為它希望傳遞一個整數時間戳。 時間戳為0表示1-1-1970。
所以它會在如果。
NULL(或?)是ABL中的奇怪生物-應對它們的最佳方法是像這樣明確測試它們:
IF value_from_db <> ? AND value_from_db > some-date THEN
/* do something */
ELSE
/* DO something else. */
簡而言之,任何涉及任何變量為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.