Um.
It is, you know...it's sorted exactly as you specified.
When you select this:
select
liftingbirds, totalweight, avgweight, dcno,
convert(varchar,liftingdate,103) as liftingdate
You are creating a new temporary Text based "column" called "liftingdate", which masks the original DateTime based version.
So when you do this:
order by
liftingdate desc
You are specifying that the records should be returned in order of the new text "column" - and the sort is a text sort (character by character) as a result.
Try:
select
liftingbirds, totalweight, avgweight, dcno,
convert(varchar,liftingdate,103) as [lifting date]
from
k_LiftingEntryRecords
where
dcno = @dcno
order by
liftingdate desc