我有以下SQL,它必须运行两次才能用NULL以外的值填充"duration_in_queue"。
我假设SQL变量没有被设置或存储?
我已经做了几个小时,试图找到一个解决方案,但没有成功,希望这里有人能帮忙:)
SELECT
DATE(pm.rstdtime) AS cntldate,
sh.sd_no,
sh.work_group,
ROUND(
IF (
@sd_id = sh.sd_no,
(
TIMESTAMPDIFF(
SECOND,
@dt,
sh.data_entry_dtime
) / 86400
) * 86400 + LEAST(0, @dt := sh.data_entry_dtime),
NULL + LEAST(0, @sd_id := sh.sd_no) + (@dt := sh.data_entry_dtime)
)
) AS duration_in_queue
FROM
p_master pm
LEFT JOIN s_history sh ON pm.sd_no = sh.sd_no,
(SELECT(@sd_id := 0)) AS a
WHERE
sh.log_text IN (
'Created',
'Dispatched',
'Restored'
)
AND CONVERT_TZ(
sh.data_entry_dtime,
'GMT',
'Australia/NSW'
) <= pm.rstdtime
ORDER BY
sh.sd_no,
sh.data_entry_dtime,
sh.log_text
LIMIT 10
如有任何帮助,我们将不胜感激。
谢谢。
我假设SQL变量没有被设置或存储?
这很可能是正确的。
根据文件:
作为一般规则,您永远不应该将值分配给用户变量并在同一语句中读取该值。你可能会得到你期望的结果,但这并不能保证。涉及用户变量的表达式的求值顺序是未定义的,并且可以根据给定语句中包含的元素进行更改;此外,这个顺序不能保证在MySQL Server的不同版本之间是相同的。