Best approach to remove time part of datetime in SQL Server

Which method provides the best performance when removing the time portion from a datetime field in SQL Server?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

or

b) select cast(convert(char(11), getdate(), 113) as datetime)

The second method does send a few more bytes either way but that might not be as important as the speed of the conversion.

Both also appear to be very fast, but there might be a difference in speed when dealing with hundreds-of-thousands or more rows?

Also, is it possible that there are even better methods to get rid of the time portion of a datetime in SQL?


Strictly, method a is the least resource intensive:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Proven less CPU intensive for same total duration a million rows by some one with way too much time on their hands: Most efficient way in SQL Server to get date from date+time?

I saw a similar test elsewhere with similar results too.

I prefer the DATEADD/DATEDIFF because:

  • varchar is subject to language/dateformat issues
    Example: Why is my CASE expression non-deterministic?
  • float relies on internal storage
  • it extends to work out first day of month, tomorrow etc by changing "0" base
  • Edit, Oct 2011

    For SQL Server 2008+, you can CAST to date . Or just use date so no time to remove.

    Edit, Jan 2012

    A worked example of how flexible this is: Need to calculate by rounded time or date figure in sql server

    Edit, May 2012

    Do not use this in WHERE clauses and the like without thinking: adding a function or CAST to a column invalidates index usage. See number 2 here: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

    Now, this does have an example of later SQL Server optimiser versions managing CAST to date correctly, but generally it will be a bad idea ...


    在SQL Server 2008中,您可以使用:

    CONVERT(DATE, getdate(), 101)
    

    Of-course this is an old thread but to make it complete.

    From SQL 2008 you can use DATE datatype so you can simply do:

    SELECT CONVERT(DATE,GETDATE())
    
    链接地址: http://www.djcxy.com/p/94364.html

    上一篇: 我怎样才能在SQL中选择一个月的第一天?

    下一篇: 在SQL Server中删除部分日期时间的最佳方法