It could be because you are not supplying post id in time parameter function.
In place of the_time('d F')
try using echo get_the_time('d F'm $post->ID)
because it will give you the flexibility to supply post id when you are in a loop.
Reference: get_the_time Codex
EDIT
My bad, I guess $post variables are not being set by your method. I have designed the code as per your need.
<?php
//Retrieving all the Distinct years.
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date");
//Loop for printing yearwise Posts
foreach($years as $year){
$the_query = new WP_Query(array(
'post_type' => 'post', //Replace your Post Type HERE. If retrieving from default posts then simple use *post* or remove element.
'year' =>$year
));
echo '<h2>'.$year.'</h2>';
echo '<ul>';
while($the_query->have_posts()):
$the_query->the_post();
echo '<em>'.get_the_date('d F').'</em>';
echo '<li><a href="'.get_permalink( $post->ID ).'">'.get_the_title().'</a></li>';
endwhile;
wp_reset_postdata();
}
echo '</ul>'
?>
WP_query is the authentic way. to retrieve posts within wordpress DB, because it sets all the global and local variables automatically.