SELECT GETDATE()
返回时间:2008-09-22 15:24:13.790
我想要没有时间部分的日期部分:2008-09-22 00:00:00.000
我怎么能得到那个?
SELECT GETDATE()
返回时间:2008-09-22 15:24:13.790
我想要没有时间部分的日期部分:2008-09-22 00:00:00.000
我怎么能得到那个?
当前回答
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快得多。
其他回答
select cast(createddate as date) as derivedate from table
createdate是您的datetime列,这适用于sqlserver
简单地说,您可以这样做:
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
或者简单地这样做:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
结果:
Date Part Only
--------------
2013-07-14
在这种情况下,仅限日期,我们将运行以下查询:
选择转换(VARCHAR(10),getdate(),111);
如果您使用的是SQL Server 2012或更高版本,
使用Format()函数。
SQL server已经有多种答案和格式类型。但是,大多数方法都有些模糊,您很难记住格式类型或函数的数字,而不是特定日期格式。这就是为什么在SQL server的下一个版本中有更好的选择。
FORMAT ( value, format [, culture ] )
文化选项非常有用,因为您可以根据您的观众指定日期。
你必须记住d(小模式)和d(长模式)。
1.“d”-短日期模式。
2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
2.“D”-长日期模式。
2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
查询中的更多示例。
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日
如果您需要更多格式,可以转到:
标准日期和时间格式字符串自定义日期和时间格式字符串
如果要将结果分配给列或变量,请为其指定DATE类型,并且转换是隐式的。
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03