Is there a way to only execute part of a WHERE statement perhaps using some sort of IF-THEN statement based on data in the database?
The code below displays scheduled tasks for a specific date correctly in most cases, but there is an anomaly. If someone creates a task and then sets a start date before the date they created it, the task won't show up even though it is scheduled on that day.
In this example, we only want to use the create date (ie TaskCreated <= '". $DisplayDateTime. "'"
) if the start date is not set (ie TaskStartDate = '' OR TaskStartDate is NULL'
) If the TaskStartDate
is set, then we want to use that date instead of the create date for the date range.
// Displays tasks that are scheduled on a particular date or marked as "focus"
$sql = "SELECT * FROM Reminders";
$sql = $sql . " " . "WHERE TaskUserID = " . $loggedinuser;
$sql = $sql . " " . "AND ( TaskFocus = 1";
$sql = $sql . " " . "OR ( TaskCreated <= '" . $DisplayDateTime . "'";
$sql = $sql . " " . "AND ( TaskStartDate <= '" . $DisplayDate . "' OR TaskStartDate = '' OR TaskStartDate is NULL )";
$sql = $sql . " " . "AND ( TaskPauseDate <= '" . $DisplayDate . "' OR TaskPauseDate = '' OR TaskPauseDate is NULL )";
$sql = $sql . " " . "AND ( TaskSchedDate >= '" . $DisplayDate . "' AND TaskSchedDate is NOT NULL )" ;
$sql = $sql . " " . "AND ( TaskDueDate <> '" . $DisplayDate . "' OR TaskDueDate = '' OR TaskDueDate is NULL )";
$sql = $sql . " " . ") )";
$sql = $sql . " " . "AND ( TaskPauseDate <= '" . $DisplayDate . "' OR TaskPauseDate = '' OR TaskPauseDate is NULL )";
$sql = $sql . " " . "ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC";
SQL:
SELECT * FROM Reminders
WHERE TaskUserID = 1
AND ( ( TaskCreated <= '2020-12-03 23:59:59'
AND ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL )
AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
AND ( TaskSchedDate >= '2020-12-03' AND TaskSchedDate is NOT NULL )
AND ( TaskDueDate >= '2020-12-03' OR TaskDueDate = '' OR TaskDueDate is NULL ) ) )
AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC
How is the best way to fix that anomaly?
You can try replacing TaskCreated <= '". $DisplayDateTime. "'"
with
((TaskCreated <= '". $DisplayDateTime. "') OR (TaskStartDate = '' OR TaskStartDate is NULL'))"
The sql in PHP HEREDOC string. (easier to read)
$sql = <<<WXC
SELECT * FROM Reminders
WHERE TaskUserID = $loggedinuser
AND ( (( TaskStartDate <= '{$DisplayDate}' and (TaskStartDate <> '' AND TaskStartDate is NOT NULL ))
OR (TaskCreated <= '{$DisplayDateTime}' AND ( TaskStartDate is NULL OR TaskStartDate = '' ) ))
AND ( TaskPauseDate <= '{$DisplayDate}' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
AND ( TaskSchedDate >= '{$DisplayDate}' AND TaskSchedDate is NOT NULL )
AND ( TaskDueDate <> '{$DisplayDate}' OR TaskDueDate = '' OR TaskDueDate is NULL )
AND ( TaskPauseDate <= '{$DisplayDate}' OR TaskPauseDate = '' OR TaskPauseDate is NULL ))
ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC
WXC;
//
Look at the CASE statement in SQL
In order to get it to work as expected, you would need to change:
$sql = $sql. " ". "AND ( TaskCreated <= '". $DisplayDateTime. "'";
to this:
$sql = $sql . " " . "AND ( ( TaskCreated <= '" . $DisplayDateTime . "'";
$sql = $sql . " " . "OR ( TaskStartDate <= '" . $DisplayDate . "' OR TaskStartDate = '' OR TaskStartDate is NULL ) )";
This would show both tasks created on a certain date or started on a certain date and show tasks with no start date.
SQL:
SELECT * FROM chReminders
WHERE TaskUserID = 1
AND ( ( ( TaskCreated <= '2020-12-03 23:59:59'
OR ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL ) )
AND ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL )
AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
AND ( TaskSchedDate >= '2020-12-03' AND TaskSchedDate is NOT NULL )
AND ( TaskDueDate >= '2020-12-03' OR TaskDueDate = '' OR TaskDueDate is NULL ) ) )
AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.