如何仅从SQL Server DateTime数据类型返回日期

时间:2020-03-06 14:31:22  来源:igfitidea点击:
SELECT GETDATE()

返回:2008-09-22 15:24:13.790

我希望该日期部分没有时间部分:2008-09-22 00:00:00.000

我该怎么办?

解决方案

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

SQL Server 2008或者更高版本上,我们应该CONVERT到目前为止:

SELECT CONVERT(date, getdate())

在旧版本上,我们可以执行以下操作:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

例如

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

给我

2008-09-22 00:00:00.000

优点:

  • 不需要varchar <-> datetime转换
  • 无需考虑locale

我们可以使用CONVERT函数仅返回日期。请参阅下面的链接:

SQL Server 2000中的日期和时间处理

转换并转换

使用convert函数的语法为:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

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

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

编辑:前两个方法本质上是相同的,并执行转换为varchar方法。

使用FLOOR()只是减少了时间部分。

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

DATEADD和DATEDIFF优于转换为varchar。这两个查询具有相同的执行计划,但是执行计划主要是关于数据访问策略的,并不总是显示执行所有步骤所花费的CPU时间所隐含的成本。如果两个查询都针对具有数百万行的表运行,则使用DateDiff的CPU时间可能接近"转换CPU时间"的1/3!

要查看查询的执行计划:

set showplan_text on
GO

DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。

尽管CONVERT解决方案更简单一些,但阅读起来却很慢。无需回退到日期时间(这是由服务器隐式完成的)。之后,DateAdd的DateDiff方法中也没有真正的需求,因为整数结果也将隐式转换回datetime。

SELECT CONVERT(varchar,MyDate,101)从DatesTable

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

从DatesTable中选择SELECT DATEADD(dd,0,DATEDIFF(dd,0,MyDate))

|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

使用FLOOR()作为@digi建议的性能接近于DateDiff,但不建议这样做,因为将datetime数据类型强制转换为float和back并不总是产生原始值。

记住伙计们:不要相信任何人。查看性能统计信息,然后自己进行测试!

测试结果时请多加注意。选择许多行给客户端将隐藏性能差异,因为通过网络发送行比执行计算花费的时间更长。因此,请确保所有行的工作均由服务器完成,但没有行集发送给客户端。

对于某些人来说,关于缓存优化何时影响查询似乎有些困惑。在同一批次或者不同批次中运行两个查询对缓存没有影响。因此,我们既可以手动使缓存过期,也可以简单地多次运行查询。查询2的任何优化也会影响后续查询,因此,如果我们愿意,可以放弃执行1.

这是完整的测试脚本和性能结果,证明DateDiff比转换为varchar的速度快得多。

SQLServer 2008现在具有"日期"数据类型,该数据类型仅包含没有时间成分的日期。使用SQLServer 2008及更高版本的任何人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())