如何删除日期时间值(SQL Server)的时间部分?

时间:2008-08-05 20:08:39

标签: sql-server datetime date-conversion

以下是我使用的内容:

SELECT CAST(FLOOR(CAST(getdate() as FLOAT)) as DATETIME)

我认为可能会有更好更优雅的方式。

要求:

  • 必须尽可能快(铸造越少越好)。
  • 最终结果必须是datetime类型,而不是字符串。

6 个答案:

答案 0 :(得分:110)

答案 1 :(得分:30)

SQL Server 2008有一个新的date data type,这将此问题简化为:

SELECT CAST(CAST(GETDATE() AS date) AS datetime)

答案 2 :(得分:18)

<{3}}中的Itzik Ben-Gan(SQL Server杂志,2007年2月)显示了执行此类转换的三种方法(最慢​​到最快;第二种和第三种方法之间的差异很小):

SELECT CAST(CONVERT(char(8), GETDATE(), 112) AS datetime)

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

SELECT CAST(CAST(GETDATE() - 0.50000004 AS int) AS datetime)

你的技巧(投射到 float )是由该杂志4月刊的读者提出的。据他介绍,它的性能可与上述第二种技术相媲美。

答案 3 :(得分:12)

您的CAST - FLOOR - CAST似乎已经成为最佳方式,至少在MS SQL Server 2005上是这样。

我见过的其他一些解决方案有一个字符串转换,比如Select Convert(varchar(11), getdate(),101),它慢了10倍。

答案 4 :(得分:4)

请尝试:

SELECT CONVERT(VARCHAR(10),[YOUR COLUMN NAME],105) [YOURTABLENAME]

答案 5 :(得分:1)

SQL2005:我建议使用cast而不是dateadd。例如,

select cast(DATEDIFF(DAY, 0, datetimefield) as datetime)

我的数据集

平均大约10%更快
select DATEADD(DAY, DATEDIFF(DAY, 0, datetimefield), 0)

(并且铸造成smalldatetime的速度更快)