我尝试管理交付团队。 这就是为什么,我想要显示一张桌子。第一行将在白天完成。 以下行将填充状态及其持续时间。 行“日期”必须包含该月的所有日期。即使没有人工作。
[Build or something]
我的SQL请求:
- First table (typeState) -
deliveryStatusDuration //State Time (seconds) INTEGER
deliveryStatus //Type Status INTEGER
startStatus //Start of the state DATE
endStatus //End of the state DATE
deliveryCarNum //deliverer identifier INTEGER
- Second table (dateTable) -
dateInt // Just an integer (from 1 to 31) INTEGER
问题是无论使用的是什么月份,都会显示所有信息。 我认为“或”会破坏我的“和”,所以我没有状态开始的那些日子。 例如,如果送货员在2016年5月4日开始交付并于2016年5月8日结束;我的要求没有出现在8月4日: 1 2 3 5 6 7 8 9 10 ... 31
答案 0 :(得分:1)
正如戈登的评论所暗示的那样。您想将OR组合在一起。
AND (THIS OR THAT OR THEOTHER)
而不是
AND (THIS)
OR (THAT)
OR (THEOTHER)
答案 1 :(得分:1)
我猜你想要的WHERE
条款是:
WHERE deliveryCarNum = :CarNum AND
startStatus >= :DateStart AND
endStatus <= :DateEnd AND
(typeState.startStatus Is Null OR
typeState.deliveryStatus Is Null OR
datetable.dateInt <= DAY(:DateEnd)
)
答案 2 :(得分:1)
这是工作! :
SELECT SUM(deliveryStatusDuration) AS DURATION, deliveryStatus, datetable.dateInt
FROM datetable
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus)
WHERE deliveryCarNum = :CarNum AND
startStatus >= :DateStart AND
endStatus <= :DateEnd AND
(
typeState.startStatus Is Null OR
typeState.deliveryStatus Is Null OR
datetable.dateInt <= DAY(:DateEnd)
)
GROUP BY datetable.dateInt, deliveryStatus
此请求选择右行(无论日期)。 但我每天都看不到......
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus) OR ((DAY(typeState.startStatus) Is Null))