提问



SELECT GETDATE()


退货:2008-09-22 15:24:13.790


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


我怎么能得到它?

最佳参考


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


其它参考1


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


SELECT CONVERT(date, GETDATE())

其它参考2


如果使用SQL 2008及更高版本:


select cast(getdate() as date)

其它参考3


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


要查看查询的执行计划:


set showplan_text on
GO 


DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。


尽管CONVERT解决方案对某些人来说更简单易读,但 更慢。无需转换回日期时间(这由服务器隐式完成)。之后DateDiff方法中也没有真正需要DateAdd,因为整数结果也将被隐式转换回datetime。





SELECT CONVERT(varchar,MyDate,101)FROM DatesTable


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





SELECT DATEADD(dd,0,DATEDIFF(dd,0,MyDate))FROM DatesTable


  |--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并且返回并不总是产生原始值。


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


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


某些人似乎对缓存优化何时影响查询感到困惑。在同一批次或不同批次中运行两个查询对缓存没有影响。因此,您可以手动使缓存过期,也可以只是多次来回运行查询。查询#2的任何优化也会影响任何后续查询,因此如果您愿意,请抛弃执行#1。


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

其它参考4


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

其它参考5


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

其它参考6


您可以使用CONVERT功能仅返回日期。请参阅以下链接:


SQL Server 2000中的日期和时间操作[61]


CAST和CONVERT [62]


使用convert函数的语法是:


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

其它参考7


以日期格式返回



  CAST(OrderDate AS日期)



上面的代码将在sql server 2010中运行


它将像12/12/2013一样返回


对于SQL Server 2012,请使用以下代码


CONVERT(VARCHAR(10), OrderDate , 111)

其它参考8


使用FLOOR() - 只是削减时间部分。


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

其它参考9


SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

其它参考10


如果你想使用CONVERT并获得与提出的原始问题相同的输出,也就是说,yyyy-mm-dd然后使用CONVERT(varchar(10),[SourceDate as dateTime],121)与前几个答案相同的代码,但代码转换为yyyy-mm破折号的-dd是121。


如果我可以使用我的肥皂盒一秒钟, 这种格式不属于数据层 ,这就是为什么它不可能没有愚蠢在SQL Server 2008引入实际的datepart数据类型之前的高开销技巧。在数据层中进行这样的转换会大大浪费DBMS的开销,但更重要的是,第二次你做这样的事情,你基本上已经有了创建了内存中的孤立数据,我假设你将返回一个程序。你不能把它放回另一个3NF +列或者将它与任何类型的数据进行比较而不需要恢复,所以你所做的就是引入失败点和删除了关系参考。


您应该始终将dateTime数据类型返回到调用程序,并在PRESENTATION层中将 返回,进行必要的调整。 在返回之前一旦转换完东西它们对调用者来说,你正在从应用程序中删除所有参照完整性的希望。这将再次阻止UPDATE或DELETE操作,除非您进行某种手动恢复,这在需要时再次将您的数据暴露给human/code/gremlin错误。

其它参考11


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方法。

其它参考12


如果您使用的是 SQL Server 2012或更高版本



使用Format()功能。[63]


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日


如果您想要更多格式,可以去:



  1. 标准日期和时间格式字符串

  2. 自定义日期和时间格式字符串


其它参考13


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

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

其它参考14


为了获得指示的结果,我使用以下命令。[64] [65]


SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))


我说它很有用。

其它参考15


如果你需要varchar数据类型的结果,你应该通过


SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26


这已经在上面提到了


如果您需要结果的日期和时间格式,您应该通过以下任何一个查询


1)SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) as OnlyDate --2014-03-26 00:00:00.000


2)SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) as OnlyDate - 2014-03-26 00:00:00.000


3)


 DECLARE  @OnlyDate DATETIME
   SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
   SELECT @OnlyDate AS OnlyDate


--2014-03-26 00:00:00.000

其它参考16


如果要将结果分配给列或变量,请为其指定DATE类型,并且隐式转换。


DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

其它参考17


我认为这适用于您的情况:


CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

其它参考18


好的,虽然我有点迟了:),这是另一个解决方案。


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


结果


2008-09-22 00:00:00.000


如果您使用的是SQL Server 2012及更高版本,则可以使用FORMAT()这样的函数 -


SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

其它参考19


即使使用古老的MSSQL Server 7.0,这里的代码(由此链接提供)使我能够获得我当时正在寻找的任何日期格式:[66]


PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)


它产生了这个输出:


1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

其它参考20


DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

其它参考21


我赞成以下没有提及:


DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))


它也不关心本地或做双重转换 - 虽然每个datepart可能都是数学。所以它可能比dateiff方法慢一点,但对我来说它更清楚。特别是当我想要按年份和月份分组(将日期设置为1)。

其它参考22


日期:


SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)


时间:


SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

其它参考23


从SQL SERVER 2012开始,您可以这样做:


SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

其它参考24


在SQL Server 2000上


CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

其它参考25


为什么不使用DATE_FORMAT(your_datetiem_column,%d-%m-%Y)?


EX:select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name


你可以通过重新安排'%d-%m-%Y'部分来改变m,d和年的顺序

其它参考26


这在所有答案中都缺失,可能不是最有效但很容易编写和理解,不需要样式,没有复杂的日期函数。


SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))

其它参考27


您可以使用以下日期部分和格式化日期:


DATENAME =>返回表示指定日期的指定日期部分的字符串


DATEADD => DATEPART()功能用于返回日期/时间的单个部分,例如年,月,日,小时,分钟等。


DATEPART =>返回一个整数,表示指定日期的指定日期部分。


CONVERT() => CONVERT()函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。

CONVERT()功能可用于以不同格式显示日期/时间数据。

其它参考28


日期(日期和时间字段) DATE_FORMAT(日期和时间,%Y-%m-%d)都返回仅日期从日期和时间

其它参考29


我知道这是旧的,但我没有看到有人这样说过。据我所知,这是ANSI标准。


SELECT CAST(CURRENT_TIMESTAMP AS DATE)


如果Microsoft也支持ANSI标准CURRENT_DATE变量,那将是件好事。