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

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

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

The second method does send a few m或e bytes either way but that might not be as imp或tant 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 或 m或e rows?

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

推荐答案

严格来说,方法a是资源密集度最低的:

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

经证明,在相同的总持续时间内,Most efficient way in SQL Server to get a date from date+time?万行的CPU密集度较低

我在其他地方也看到了类似的测试结果.

我更喜欢DATEADD/DATEDIFF,因为:

  • varchar会遇到语言/日期格式问题
  • float依赖于内部存储
  • 它通过更改"0"基数扩展到计算月的第一天、明天等

Edit, Oct 2011

对于SQL Server 2008+,可以强制转换为date,即CAST(getdate() AS date).或者只使用date数据类型,这样就没有time可以删除.

Edit, Jan 2012

这是一个非常灵活的例子:Need to calculate by rounded time or date figure in sql server

Edit, May 2012

不要在WHERE子句之类的情况下不加思考地使用它:向列添加函数或强制转换会使索引用法无效.请看这里的数字2

现在,这确实有一个SQL Server Optimizer更高版本正确管理CAST的例子,但这将是一个坏主意...

Edit, Sep 2018, for 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)

Sql相关问答推荐

PostgreSQL行级锁

调用存储过程时SQL服务器TDS协议响应问题

SQL—如何在搜索的元素之后和之前获取元素?

用于动态查询情况的存储过程常识模式

SQL—如何根据2列填写缺失的值

Oracle SQL根据列中的条件 Select 最大记录数

SQL:如何查找聚合满足条件的连续日期

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

Select 非重复值并按条件排除行

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

如何用HeidiSQL在Firebird中设置超时?

在WHERE EXISTS子查询中,列返回是否重要?

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

统计PostgreSQL中前10个最大大小表的行数

查询以从时间范围列表中查找唯一时间段

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

在给定的日期范围内填写缺失的日期

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

SQL/Postgres:按日期和其他属性对相关性能进行分组