即使在几年后,这仍然会不断地增加选票,所以我需要为SQLServer的现代版本更新它。对于SQLServer 2008及更高版本,它很简单:
cast(getDate() As Date)
请注意,底部附近的最后三段仍然适用,您通常需要后退一步,并找到一种方法来避免第一时间的转换。
但也有其他方法可以实现这一点。以下是最常见的。
正确的方法(自SQLServer 2008以来新的):
cast(getdate() As Date)
正确的方式(旧的):
dateadd(dd, datediff(dd,0, getDate()), 0)
这是旧的,但它仍然值得知道,因为它也可以很容易地适应其他时间点,如一个月的第一分钟,小时,或年。
这种正确的方法使用作为Ansi标准一部分的文档化的函数,并保证它们能够正常工作,但它可能会稍微慢一些。它的工作原理是找出从第0天到今天有多少天,并把这几天加到第0天。无论您的日期时间是如何存储的,无论您的地区是什么,它都会工作。
快速方式:
cast(floor(cast(getdate() as float)) as datetime)
这是因为Datetime列存储为8字节二进制值。将它们抛到浮点,使其底部移除该分数,当您将它们转换回DateTime时,值的时间部分就会消失。这只是一点点的变化,没有复杂的逻辑,而且非常快地。
请注意,这依赖于实现细节,Microsoft可以随时更改,甚至在自动服务更新中也是如此。它也不是很便携。在实践中,这种实现不太可能很快改变,但是如果您选择使用它,仍然需要意识到它的危险。既然我们可以选择约会,那就没什么必要了。
错误的方式:
cast(convert(char(11), getdate(), 113) as datetime)
错误的工作方式是转换为字符串、截断字符串并将其转换回日期时间。它是不对,原因有两个:1)它可能不适用于所有的地区;2)它是最慢的方法来实现这一点.而不只是一点点,它就像一个数量级或两个数量级比其他选项慢。
更新最近,这获得了一些选票,因此我想补充一点,自从我发布这篇文章以来,我看到了一些非常确凿的证据,表明SQL Server将优化“正确”方式和“快速”方法之间的性能差异,这意味着您现在应该更喜欢前者。
不管是哪种情况,你都想写您的查询,以避免在第一时间这样做。..在数据库上做这项工作是非常罕见的。
在大多数地方,数据库已经成为您的瓶颈。通常,服务器是增加硬件以提高性能最昂贵的服务器,也是最难实现这些添加的服务器(例如,您必须平衡磁盘和内存)。从技术和业务角度来看,向外扩展也是最困难的;在技术上添加Web或应用程序服务器要比添加数据库服务器容易得多,即使这是错误的,IIS或Apache也不会为每个服务器许可证支付20,000美元以上的费用。
我想指出的一点是,只要有可能,您就应该在应用程序级别完成这项工作。这个只当您需要按日分组时,您应该发现自己截断了SQLServer上的日期时间,即使这样,您也应该将一个额外的列设置为计算列,在插入/更新时维护,或者在应用程序逻辑中维护。把这个破坏索引的,CPU繁重的工作从你的数据库中拿出来。