从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,因为:
编辑,2011年10月
对于SQL Server 2008+,您可以CAST到date
ie 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对象。您可以按照以上说明进行打印时更改对象,或者在创建对象时执行以下操作: