Supposedly all current all day events are done by explicitly setting start time 0:00, sometimes setting end time also as such. Otherwise they just don't work with sqlite backend.

E.g. from contactsd -> cdbirthdaycalendar.cpp:

    event->setDtStart(KDateTime(contactBirthday, QTime(), KDateTime::ClockTime));
    event->setDtEnd(KDateTime(contactBirthday.addDays(1), QTime(), KDateTime::ClockTime));

This is just wrong. Adding a day to a time point should reach next day, should come more or less from the definition of the operation.

The disease seems to be spread badly enough that fixing sqlite wouldn't do much.