为了账号安全,请及时绑定邮箱和手机立即绑定

如何仅从SQLServer日期时间数据类型返回日期

如何仅从SQLServer日期时间数据类型返回日期

MYYA 2019-06-03 16:53:19
如何仅从SQLServer日期时间数据类型返回日期SELECT GETDATE()返回:2008-09-22 15:24:13.790我想要那个日期部分而不是时间部分:2008-09-22 00:00:00.000我怎么能拿到呢?
查看完整描述

5 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

SQLSERVER 2008现在有一个“Date”数据类型,它只包含一个没有时间组件的日期。任何使用SQLSERVER 2008及更高版本的人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())


查看完整回答
反对 回复 2019-06-03
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如果使用SQL 2008及以上版本:

select cast(getdate() as date)


查看完整回答
反对 回复 2019-06-03
?
临摹微笑

TA贡献1982条经验 获得超2个赞

DATEADD和DATEDIFF比转换为varchar更好。这两个查询都有相同的执行计划,但是执行计划主要是关于数据访问策略,并且不总是显示执行所有部分所需的CPU时间所涉及的隐含成本。如果两个查询都针对数百万行的表运行,则使用DateDiff的CPU时间可以接近转换CPU时间的三分之一!

要查看查询的执行计划:

set showplan_text onGO

DATEADD和DATEDIFF都将执行转换_隐式。

虽然对某些人来说,转换解决方案更简单、更容易阅读,但它慢点。不需要将数据转换为DateTime(这是服务器隐式完成的)。之后,DateDiff方法对于DateAdd也没有真正的需求,因为整数结果也将被隐式转换回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,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]))

正如@digi所建议的那样,使用place()具有更接近DateDiff的性能,但不建议将Datetime数据类型转换为浮动和返回,但并不总是产生原始值。

记住伙计们:不要相信任何人。查看性能统计数据,并自己测试它!

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

对于某些人来说,缓存优化何时影响查询似乎有些混乱。在同一批或在不同批处理中运行两个查询对缓存没有影响。因此,您可以手动终止缓存,也可以简单地多次来回运行查询。对查询#2的任何优化也会影响后续的查询,因此如果您愿意,可以抛出执行#1。

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


查看完整回答
反对 回复 2019-06-03
  • 5 回答
  • 0 关注
  • 1309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信