Here is the code if all of your rows are on the same date, like your example:
SELECT id, abholdatum, abholzeit, MIN(endzeit) AS endzeit, TIMESTAMPDIFF(SECOND, MIN(endzeit), abholzeit) AS diff
FROM bestellungen AS early
LEFT JOIN (
SELECT abholzeit AS endzeit FROM bestellungen
) AS later
WHERE endzeit > abholzeit
GROUP BY id
ORDER BY abholzeit
What I am going is joining all combinations of anything in the table, but limiting it to situation where the second time (endzeit) is greater than the first (abholzeit). Then I am grouping by id so that there is only one entry for each start time.
Then I use MIN(endzeit) to get the lowest value of the end time (which had to be greater than the start time.) I then use the function TIMESTAMPDIFF to get the difference in seconds. Not quite sure how the last time will turn out.
Right now it'll break with results on different dates, but your example had all of one date. You need to do some work with different dates, since there are a lot of different combos where the date is earlier but the time is later, etc.
Different dates would be a lot easier if the date and time were in one column, then you could just use the above solution. Here is a (not fully functional) example of what it might look like for different dates:
SELECT id, abholdatum, abholzeit, MIN(endzeit) AS endzeit, TIMESTAMPDIFF(SECOND, MIN(endzeit), abholzeit) + TIMESTAMPDIFF(SECOND, abholdatum, enddate) AS diff
FROM bestellungen AS early
LEFT JOIN (
SELECT abholzeit AS endzeit, abholdatum AS enddate FROM bestellungen
) AS later
WHERE (endzeit > abholzeit
AND enddate = abholdatum)
OR enddate > abholdatum
GROUP BY id
ORDER BY abholdatum, abholzeit
WARNING, that last code is still really broken. For example, it could get a time from MIN(endzeit) that is the lowest time, but from a really far away date. An actual solution would be involved. I recommend, if possible, just merging date and time into one column.