如何仅从SQL Server DateTime数据types返回date

SELECT GETDATE() 

2008-09-22 15:24:13.790

2008-09-22 00:00:00.000我希望没有时间的date部分

我怎么能得到这个?

在SQL Server 2008及更高版本上,您应该转换为date:

 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转换
  • 不需要考虑地区

SQLServer 2008现在有一个“date”数据types,它只包含一个没有时间分量的date。 任何使用SQLServer 2008或更高版本的人都可以执行以下操作:

 SELECT CONVERT(date, GETDATE()) 

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

 select cast(getdate() as date) 

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

查看查询的执行计划:

 set showplan_text on GO 

DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。

尽pipeCONVERT解决scheme比较简单,而且更容易阅读,但速度较慢。 没有必要回到date时间(这是由服务器隐式完成的)。 之后,DateDiff方法中也没有实际的需要,因为整数结果也会隐式转换回date时间。


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])) 

build议使用FLOOR()作为@digi的性能接近于DateDiff,但不推荐将date时间数据types转换为浮点数,并且返回并不总是产生原始值。

记住家伙:不要相信任何人。 看性能统计,并自己testing!

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

有些人似乎对caching优化何时影响查询感到困惑。 在同一批次或分批运行两个查询对caching没有影响。 因此,您可以手动过期caching,或者只需多次来回查询。 查询#2的任何优化都会影响后续的任何查询,所以如果你愿意,可以抛出执行#1。

这里是完整的testing脚本和性能结果 ,certificateDateDiff比转换为varchar快得多。

 SELECT CONVERT(VARCHAR(10),GETDATE(),111) 
 SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)) 

以date格式返回

CAST(OrderDate ASdate)

上面的代码将在sql server 2010中工作

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

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

 CONVERT(VARCHAR(10), OrderDate , 111) 

您可以使用CONVERT函数仅返回date。 请参阅下面的链接:

date和时间在SQL Server 2000中的操作

CAST和CONVERT

使用convert函数的语法是:

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

使用FLOOR() – 只是切割时间的一部分。

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

如果你想使用CONVERT,并得到与原来的问题相同的输出,也就是yyyy-mm-dd,那么使用CONVERT(varchar(10),[SourceDate as dateTime],121) ,但是用破折号转换为yyyy-mm-dd的代码是121。

如果我可以使用我的soapbox一秒钟, 这种格式不属于数据层 ,这就是为什么直到SQL Server 2008实际的date部分数据types之前,没有愚蠢的高开销的“技巧”介绍。 在数据层中进行这种转换是DBMS系统开销的巨大浪费,但更重要的是,第二种方法是这样做的,你基本上创build了内存中的孤立数据,我假设你将返回到程序中。 你不能把它放回到另外一个3NF +列,或者把它与没有返回的types进行比较,所以你所做的只是引入了失败点并删除了关系引用。

您应该总是先行,并将您的dateTime数据types返回给调用程序,然后在PRESENTATION层中进行必要的调整。 只要你在把它们返回给调用者之前把事情转化,你就从应用程序中移除了所有参照完整性的希望。 这样可以防止UPDATE或DELETE操作,除非你做了某种手动回复,在没有必要的时候,它又将数据暴露给人类/代码/ gremlin错误。

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

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

要获得所示的结果,我使用以下命令。

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

我认为它是有用的。

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

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

这已经在上面提到过了

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

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

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

3)

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

– 2014年4月26日00:00:00.000

我认为这将适用于你的情况:

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

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

使用Format()函数。

SQL Server已经有了多个答案和格式化types。 但是大多数方法都有些模棱两可,对于格式types或者函数来说,关于特定date格式的数字很难记住。 这就是为什么在下一个版本的SQL Server中有更好的select。

 FORMAT ( value, format [, culture ] ) 

文化选项非常有用,因为您可以根据观众指定date。

你必须记住d(小图案)和D(长图案)。

1.“d” – 短date模式。

 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” – 长date模式。

 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. 标准date和时间格式string
  2. 自定义date和时间格式string

即使使用古老的MSSQL Server 7.0,这里的代码(这个链接 )允许我得到当时我想要的任何date格式:

 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 

好吧,虽然我有点晚了:),这是另一个解决scheme。

 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') 

如果将结果分配给列或variables,则将其赋予DATEtypes,并且转换是隐式的。

 DECLARE @Date DATE = GETDATE() SELECT @Date --> 2017-05-03 
 DECLARE @yourdate DATETIME = '11/1/2014 12:25pm' SELECT CONVERT(DATE, @yourdate) 

为什么不使用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和年份的顺序

date(date和时间字段)DATE_FORMAT(date和时间,“%Y-%m-%d”)返回date和时间

我赞成没有提到的以下内容:

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

它也不关心本地或做双重转换 – 虽然每个“date部分”可能是math。 所以它可能比过时的方法慢一点,但对我来说则更加清楚。 特别是当我想按照年份和月份(将date设置为1)进行分组时。

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

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

您可以使用以下date部分并格式化date:

DATENAME =>返回表示指定date的指定date部分的string

DATEADD => DATEPART()函数用于返回date/时间的单个部分,如年,月,日,小时,分钟等。

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

CONVERT() => CONVERT()函数是将一种数据types的expression式转换为另一种数据types的通用函数。 CONVERT()函数可用于以不同格式显示date/时间数据。

 SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015' 

这在所有答案中都是缺失的,可能不是最有效的,但很容易写和理解,没有风格需要,没有复杂的datefunction。

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

您可以简单地使用下面的代码来获取date部分,并避免SQL中的时间部分:

 SELECT SYSDATE TODAY FROM DUAL; 

在SQL Server 2000上

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