[英]Is there a way to only execute part of a WHERE statement based on data in the database?
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?有没有办法只执行 WHERE 语句的一部分,可能使用基于数据库中数据的某种 IF-THEN 语句?
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.在此示例中,如果未设置开始日期(即TaskStartDate = '' OR TaskStartDate is NULL'
),我们只想使用创建日期(即TaskCreated <= '". $DisplayDateTime. "'"
)如果TaskStartDate
是设置,那么我们想使用该日期而不是日期范围的创建日期。
// 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: 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. "'"
您可以尝试替换TaskCreated <= '". $DisplayDateTime. "'"
with和
((TaskCreated <= '". $DisplayDateTime. "') OR (TaskStartDate = '' OR TaskStartDate is NULL'))"
The sql in PHP HEREDOC string. PHP HEREDOC 字符串中的 sql。 (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看SQL中的CASE语句
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: 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.