A purely css solution would be something like this:
<style type="text/css">
.divTest { }
.divTest:hover .lblTest { display: none; }
.divTest:hover .btnTest { display: inline; }
.lblTest { display: inline; }
.btnTest { display: none; }
</style>
<asp:GridView ID="VisitHistoryGridView" Width="100%" BorderWidth="0" runat="server" AutoGenerateColumns="false" CssClass="grid_body Leads_grid_border border_td border_btm_all" />
<Columns>
<asp:TemplateField ItemStyle-CssClass="patient_edit valign_1" SortExpression="Date"
HeaderText="Date" ItemStyle-Width="15%">
<ItemTemplate>
<div class="divTest">
<asp:Label CssClass="lblTest" ID="DateLabel" runat="server" Text='<%# Eval("Date") %>' onmouseover="ShowImage(this);"></asp:Label>
<asp:ImageButton CssClass="btnTest" ID="EditDateImageButton" runat="server" ImageUrl="~/images/edit_small.png"
CommandName="DateEditing" CommandArgument='<%# Eval("Patient_Visit_Id")%>'>
</asp:ImageButton>
</div>
</ItemTemplate>
</asp:TemplateField>
Make sure you remove the Visible="False" from your ImageButton, otherwise it won't work.