簡體   English   中英

與4gl中的NULL值和日期進行比較

[英]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 greaterTodays 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM