SELECT GETDATE()

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

我想要没有时间部分的日期部分:2008-09-22 00:00:00.000

我怎么能得到那个?


当前回答

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

其他回答

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

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

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

编辑:前两个方法基本相同,out执行转换为varchar方法。

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

要查看查询的执行计划,请执行以下操作:

set showplan_text on
GO 

DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。

虽然CONVERT解决方案对某些人来说更简单、更容易阅读,但速度较慢。不需要回滚到DateTime(这是由服务器隐式完成的)。之后,DateAdd也不需要使用DateDiff方法,因为整数结果也将隐式转换回DateTime。


从日期表选择转换(varchar,MyDate,101)

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

从日期表选择DATEADD(dd,0,DATEDIFF(dd,1,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]))

使用@digi建议的FLOOR()具有更接近DateDiff的性能,但不建议使用,因为将DateTime数据类型转换为float和back并不总是产生原始值。

记住:不要相信任何人。看看性能统计数据,然后自己测试!

测试结果时要小心。选择许多行到客户端将隐藏性能差异,因为通过网络发送行比执行计算所需的时间更长。因此,请确保所有行的工作都由服务器完成,但没有向客户端发送行集。

对于缓存优化何时影响查询,有些人似乎感到困惑。在同一批处理或单独批处理中运行两个查询对缓存没有影响。因此,您可以手动终止缓存,也可以简单地多次来回运行查询。对查询#2的任何优化也会影响任何后续查询,所以如果您愿意,请放弃执行#1。

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

如果您希望日期显示为2008-09-22 00:00:00.000

然后你可以用

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

这将以问题中的格式显示日期

如果您希望使用CONVERT并获得与所提出的原始问题相同的输出,即yyyy-mm-dd,则使用与前两个答案相同的CONVERT(varchar(10),[SourceDate as dateTime],121)代码,但用虚线转换为yyyy-mm-dd的代码为121。

如果我能马上发表意见,这种格式不属于数据层,这就是为什么在SQL Server 2008引入实际日期部分数据类型之前,如果没有愚蠢的高开销“技巧”是不可能的。在数据层中进行这样的转换是对DBMS开销的巨大浪费,但更重要的是,在执行类似操作的第二秒,基本上已经在内存中创建了孤立数据,我假设您将返回到程序。您不能将其放回另一个3NF+列中,或将其与任何类型的数据进行比较而不进行还原,因此您所做的只是引入了失败点并删除了关系引用。

您应该始终继续并将dateTime数据类型返回给调用程序,在PRESENTATION层中,进行任何必要的调整。一旦在将对象返回给调用者之前进行转换,就会从应用程序中消除引用完整性的所有希望。这将再次阻止UPDATE或DELETE操作,除非您进行某种手动还原,否则在不需要的情况下,再次将数据暴露给人类/code/gremlin错误。

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014