当前位置: 首页 > 面试题库 >

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

商骞仕
2023-03-14
问题内容

从SQL Server的datetime字段中删除时间部分时,哪种方法提供最佳性能?

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

或者

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

第二种方法的确以任何一种方式发送了更多的字节,但这可能不如转换速度那么重要。

两者看起来都非常快,但是处理成千上万行或更多行时速度可能会有所不同?

另外,是否有更好的方法可以消除SQL中日期时间的时间部分?


问题答案:

严格来说,方法a耗费的资源最少:

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

事实证明,花了太多时间的人在相同的总持续时间(一百万行)中占用了太多CPU资源:SQL Server中从date +time获取日期的最有效方法?

我在其他地方也看到了类似的测试,结果也差不多。

我更喜欢DATEADD / DATEDIFF,因为:

  • varchar受到语言/日期格式问题的影响
    示例:为什么我的CASE表达式是不确定的?

  • 浮动依赖于内部存储

  • 通过更改“ 0”基数,它可以扩展到每月的第一天,明天等

编辑,2011年10月

对于SQL Server 2008+,您可以CAST到dateie CAST(getdate() ASdate)。或者只是使用date数据类型,所以不要time删除它。

编辑,2012年5月

不要在WHERE子句等中使用此功能,而无需考虑:向列中添加函数或CAST会使索引使用无效。请参阅此处的2号常见SQL编程错误

现在,这确实有一个示例,该示例说明了可以正确管理CAST的最新SQL Server优化程序版本,但 通常 这是一个坏主意…

编辑,2018年9月,适用于datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)


 类似资料:
  • 问题内容: 我在想这样的UTC时间字符串可能是可以的,因为如果在视图键中使用它们,则可以正确排序,但是存储时区(例如)会使文档更具可读性。从可读性的角度来看,将日期转换为纪元整数似乎没有什么吸引力,但对于性能而言可能是最好的选择(或者是否有所作为?)。这里推荐的做法是什么? 问题答案: 时间是一维的东西。时间戳加上时区是二维的,描述了时间点和位置。Couch视图是一维的(但不是GeoCouch插件

  • 问题内容: 上面的代码将20分钟添加到StartTimeDate。有什么好方法可以删除那些20分钟未添加的内容?试图找到一种解决方案,但没有找到解决方案。有任何想法吗? 问题答案: 您没有任何特定的功能来减去任何日期部分 只需在前面添加负号 或乘以-1

  • 问题内容: 我想比较没有时间的日期 以上查询可以吗?或您建议的其他更好的解决方案 我正在使用SQL Server 2005 日期以UTC格式保存在服务器上 用户根据此数据属于不同的时区 问题答案: 不要使用convert-无原因地涉及字符串。一个技巧是日期时间实际上是一个数字,而天是整数部分(时间是小数部分);因此,一天是值的 底数 :那只是数学,而不是字符串-快得多 在您的情况下,无需转换回日期

  • 问题内容: 我正在做一个自动化的查询。它需要查找最后一天晚上8点到晚上8点之间的所有交易。我当时正在考虑做这样的事情 对于自动查询,这很适合找出日期部分。但是变量的TIME部分是查询执行的当前时间。有没有一种快速简单的方法来将两个变量的时间部分硬编码为8:00 PM? 问题答案:

  • 问题内容: 场景: 我有一个从Excel工作表中检索到具有多个列的数据框。其中一些列是日期:一些仅包含日期(yyyy:mm:dd),一些具有日期和时间戳(yyyy:mm:dd 00.00.000000)。 问题: 当日期不是数据框的索引时,如何从日期中删除时间戳? 我已经尝试了什么: 在SO的其他文章中使用pandas中的日期- 在datetime中删除看不见的字符并转换为字符串以及如何剥离pan

  • 问题内容: 我有一个日期字符串,想要将其转换为日期类型: 我尝试将datetime.datetime.strptime与所需的格式一起使用,但它会返回转换时间。 这是输出返回的内容: 我需要删除时间:00:00:00。 问题答案: 您想要的是datetime.date对象。您拥有的是一个datetime.datetime对象。您可以按照以上说明进行打印时更改对象,或者在创建对象时执行以下操作: