Depending on your reason for zeroing-out the time...
For me, it's often been so I could compare two dates. In that case, you're better-off sticking to >=, <= comparisons (avoid =, <>) if you can. In this way, you can do the comparisons in your WHERE clause without losing the benefit of your index.
If you're on SQl-Server 2008, they have a DATE datatype now (that doesn't include time)
You can use some creative storage format -- for example, a smallint (half the size of a smalldatetime) of YYDDD, where DDD is the Julian date (each day of the year is numbered sequentially from 1 to 365). This is a smaller datatype, and valid for >,=,< comparisons. Drawback is having to convert external dates to this format (or visa-versa) before doing a comparrison.
I guess one last thing to consider is preventing time data from getting stored in the first place.
You can also do YEAR()
, MONTY()
, etc., which will return integer values. Might not be best for comparing dates, but useful for formatting, etc.