<p>Here's what I use:</p>

<pre><code>SELECT CAST(FLOOR(CAST(getdate() as FLOAT)) as DATETIME)
</code></pre>

<p>I'm thinking there may be a better and more elegant way.</p>

<p>Requirements:</p>

<ul>
<li>It has to be as fast as possible (the less casting, the better).</li>
<li>The final result has to be a <code>datetime</code> type, not a string.</li>
</ul>

Your
```
CAST
```
-
```
FLOOR
```
-
```
CAST
```
already seems to be the optimum way, at least on MS SQL Server 2005.
Some other solutions I've seen have a string-conversion, like
```
Select Convert(varchar(11), getdate(),101)
```
in them, which is slower by a factor of 10.