Я унаследовал часть SQL, над которой я работаю, для системы отчетности. Система сосредоточена вокруг заказов на поставку, а также когда они создаются, передаются, подтверждаются и подтверждаются. Эти государства являются прогрессивным государством. Часть SQL, которую я рассматриваю, показана ниже и взята из предложения WHERE:
OR (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
OR (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
OR (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
OR (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours)
Что я обнаружил, так это то, что CreateJob может не иметь времени окончания, потому что задание не выполнено. Однако задание может выполнять более одного Заказа на поставку, поэтому бывают случаи, когда конкретный заказ был фактически создан, но задание не получает время окончания, потому что позднее произошел сбой одного из братьев и сестер. Это создает сценарий, в котором состояния все еще выполняются для PO, но он все еще отображается в этом отчете о проблеме, потому что CreateJob.endtime имеет значение NULL.
Итак, сначала есть некоторые очевидные ошибки в системе и архитектуре выше, но это отдельная проблема от того, что я сейчас решаю.
Похоже, я мог бы исправить отчет, просто добавив прогрессивные проверки в операторы AND. Так что первая проверка для CreateJob тоже меняется:
( (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
AND (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
AND (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
AND (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours))
Что уродливо и начинает запутывать вещи в забвение. Есть ли способ, как я могу сделать эквивалент следующего в SQL? В основном какой-то макрос или система #define?
CreateFailed = (CreateJob.endtime is NULL and DATEDIFF(hour, buy_date, getdate()) > Vendor.expected_create_hours)
TransmitFailed = (TransmitJob.endtime is NULL and DATEDIFF(hour, CreateJob.endtime, getdate()) > Vendor.expected_transmit_hours)
AcknowledgeFailed = (AcknowledgeJob.endtime is NULL and DATEDIFF(hour, TransmitJob.endtime, getdate()) > Vendor.expected_acknowledge_hours)
ConfirmFailed = (ConfirmJob.endtime is NULL and DATEDIFF(hour, AcknowledgeJob.endtime, getdate()) > Vendor.expected_confirm_hours)
OR (CreateFailed AND TransmitFailed AND AcknowledgeFailed AND ConfirmFailed)
OR (TransmitFailed AND AcknowledgeFailed AND ConfirmFailed)
OR (AcknowledgeFailed AND ConfirmFailed)
OR (ConfirmFailed)
Если есть общий термин или название для того, что я пытаюсь сделать, возможно, кто-то может добавить это к названию?