为了账号安全,请及时绑定邮箱和手机立即绑定

如何在SQLServer中截断日期时间?

如何在SQLServer中截断日期时间?

慕侠2389804 2019-07-26 15:14:16
如何在SQLServer中截断日期时间?在SQLServer 2008中截断日期时间值(例如删除小时、分钟和秒)的最佳方法是什么?例如:declare @SomeDate datetime = '2009-05-28 16:30:22'select trunc_date(@SomeDate)-----------------------2009-05-28 00:00:00.000
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

即使在几年后,这仍然会不断地增加选票,所以我需要为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繁重的工作从你的数据库中拿出来。



查看完整回答
反对 回复 2019-07-27
?
千万里不及你

TA贡献1784条经验 获得超9个赞

仅用于SQLServer 2008

CAST(@SomeDateTime AS Date)

然后,如果你愿意的话,把它转换回日期时间。

CAST(CAST(@SomeDateTime AS Date) As datetime)


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 1273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信