当前位置:  开发笔记 > 数据库 > 正文

如何仅从SQL Server DateTime数据类型返回日期

如何解决《如何仅从SQLServerDateTime数据类型返回日期》经验,为你挑选了23个好方法。

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看起来这个比通常使用的double convert()方法快35%(我也使用了多年).好一个. (50认同)

@pilavdzice将日期时间设置为当天的午夜**确实**离开时间.你期待什么结果?`datetime`数据类型不能*没有时间*.我认为您将数据存储与用户演示混淆.如果您想要的是一种向用户显示没有时间部分的字符串(不是零,只是空格)的方法,那么您只需要`Convert(varchar(30),@ Date,101)`或类似的东西.有关详细信息,请参阅[SQL Server联机丛书•转换和转换](http://msdn.microsoft.com/en-us/library/aa226054%28v=sql.80%29.aspx). (38认同)

我建议将答案改为`SELECT DATEADD(dd,DATEDIFF(dd,0,@ your_date),0)`因为那时`dd`可以替换为任何其他[`datepart`](http://msdn.microsoft .com/zh-cn/library/ms174420.aspx)关键字在任意级别截断你的`datetime`. (9认同)

我能看到你的解决方案唯一的缺点是,除非你知道它在做什么,否则它有点迟钝.使用双转换方法可以使您的意图更加明显,以修复代码维护者.顺便说一句,我没有低估你.我想我也会开始使用你的方法.谢谢@aku (8认同)

@ user1671639日期时间数据类型始终包含日期和时间,您无法合理地存储一个日期和时间 - 除非您使用的是SQL Server 2008,在这种情况下还有单独的"日期"和"时间"数据类型.如果你像这样使用CONVERT(),你真的想要一个字符串供以后使用,所以你会被困在那样做 - 尽管如果你使用日期格式化函数而不是关闭日期会更好 - 或者通过`CAST(... AS DATE)`或`CONVERT(DATE,...)`,在这个页面上经常提到. (7认同)


BenR.. 705

SQLServer 2008现在具有"日期"数据类型,该类型仅包含没有时间组件的日期.使用SQLServer 2008及更高版本的任何人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())

SQL2008中还有"时间"数据类型,它解决了分离日期和时间问题的另一半问题. (40认同)

仅供参考,我对从日期修剪时间的不同方法进行了基准测试,这是最快的方法.虽然差别很小,但是在大量的执行中显然更快. (6认同)

wt关于sqlserver 2005 ?? (2认同)


abatishchev.. 163

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

select cast(getdate() as date)

@Nick,为了补充abatishchev响应,由于'DateTime`限制,你的@ date1确实是'2015-10-01`.尝试没有任何演员`日期`,它产生`2015-10-01`too!`declare @ date1 datetime ='2015-09-30 23:59:59.999'; select @ date1` =>`2015-10-01` (8认同)

谨防!声明@ date1 datetime ='2015-09-30 20:59:59.999'; select cast(@ date1 as date)返回'2015-10-01' (7认同)

@Nick:这是DateTime的问题.使用`DateTime2`代替,它工作正常.http://sqlfiddle.com/#!6/9eecb7/2833 (6认同)

其中一个容易记住的SQL技巧.正如迈克所说,只有2008年才开始,但是,如果你在某个地方找到了2005年和以前的数据库,你可能会遇到很多问题:) (4认同)

@FredrickGauss:什么类型,日期?您使用的是哪个版本的SQL Server? (3认同)

通过使用“ SELECT CAST(CURRENT_TIMESTAMP AS DATE)”(“ CURRENT_TIMESTAMP”等同于“ GETDATE()”),可以使ANSI标准更进一步。 (2认同)


Ricardo C.. 71

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并且back并不总是产生原始值.

记住伙计们:不要相信任何人.查看性能统计信息,并自行测试!

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

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

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



1> aku..:

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看起来这个比通常使用的double convert()方法快35%(我也使用了多年).好一个.
@pilavdzice将日期时间设置为当天的午夜**确实**离开时间.你期待什么结果?`datetime`数据类型不能*没有时间*.我认为您将数据存储与用户演示混淆.如果您想要的是一种向用户显示没有时间部分的字符串(不是零,只是空格)的方法,那么您只需要`Convert(varchar(30),@ Date,101)`或类似的东西.有关详细信息,请参阅[SQL Server联机丛书•转换和转换](http://msdn.microsoft.com/en-us/library/aa226054%28v=sql.80%29.aspx).
我建议将答案改为`SELECT DATEADD(dd,DATEDIFF(dd,0,@ your_date),0)`因为那时`dd`可以替换为任何其他[`datepart`](http://msdn.microsoft .com/zh-cn/library/ms174420.aspx)关键字在任意级别截断你的`datetime`.
我能看到你的解决方案唯一的缺点是,除非你知道它在做什么,否则它有点迟钝.使用双转换方法可以使您的意图更加明显,以修复代码维护者.顺便说一句,我没有低估你.我想我也会开始使用你的方法.谢谢@aku
@ user1671639日期时间数据类型始终包含日期和时间,您无法合理地存储一个日期和时间 - 除非您使用的是SQL Server 2008,在这种情况下还有单独的"日期"和"时间"数据类型.如果你像这样使用CONVERT(),你真的想要一个字符串供以后使用,所以你会被困在那样做 - 尽管如果你使用日期格式化函数而不是关闭日期会更好 - 或者通过`CAST(... AS DATE)`或`CONVERT(DATE,...)`,在这个页面上经常提到.

2> BenR..:

SQLServer 2008现在具有"日期"数据类型,该类型仅包含没有时间组件的日期.使用SQLServer 2008及更高版本的任何人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())


SQL2008中还有"时间"数据类型,它解决了分离日期和时间问题的另一半问题.
仅供参考,我对从日期修剪时间的不同方法进行了基准测试,这是最快的方法.虽然差别很小,但是在大量的执行中显然更快.
wt关于sqlserver 2005 ??

3> abatishchev..:

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

select cast(getdate() as date)


@Nick,为了补充abatishchev响应,由于'DateTime`限制,你的@ date1确实是'2015-10-01`.尝试没有任何演员`日期`,它产生`2015-10-01`too!`declare @ date1 datetime ='2015-09-30 23:59:59.999'; select @ date1` =>`2015-10-01`
谨防!声明@ date1 datetime ='2015-09-30 20:59:59.999'; select cast(@ date1 as date)返回'2015-10-01'
@Nick:这是DateTime的问题.使用`DateTime2`代替,它工作正常.http://sqlfiddle.com/#!6/9eecb7/2833
其中一个容易记住的SQL技巧.正如迈克所说,只有2008年才开始,但是,如果你在某个地方找到了2005年和以前的数据库,你可能会遇到很多问题:)
@FredrickGauss:什么类型,日期?您使用的是哪个版本的SQL Server?
通过使用“ SELECT CAST(CURRENT_TIMESTAMP AS DATE)”(“ CURRENT_TIMESTAMP”等同于“ GETDATE()”),可以使ANSI标准更进一步。

4> Ricardo C..:

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并且back并不总是产生原始值.

记住伙计们:不要相信任何人.查看性能统计信息,并自行测试!

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

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

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


关于平等表现的主张并非如此.当然执行计划是一样的!!! 测量这些性能必须通过比较CPU使用率而不是检查执行计划来完成.

5> Nescio..:

试试这个:

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

以上语句将您当前的格式转换为YYYY/MM/DD,请参阅此链接以选择您喜欢的格式.


这将为我返回'2008/09/22'
如果你是根据原始文本值(在DB之外)进行排序,那么'japanese'格式会更好

6> Cade Roux..:
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))



7> DaveK..:

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

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

CAST和CONVERT

使用convert函数的语法是:

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



8> Mahesh ML..:

以日期格式返回

CAST(OrderDate AS日期)

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)


@MaheshML没有SQL Server 2010这样的东西.

9> 小智..:

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

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

这已经在上面提到了

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

1)varcharas OnlyDate --2014-03-26 00:00:00.000

2)varcharas OnlyDate - 2014-03-26 00:00:00.000

3)

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 

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



10> 小智..:
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



11> DiGi..:

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

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


这种方法并不是最快的,并且还隐含地教导人们将日期转换为浮动是准确的,但事实并非如此.请参阅[这篇文章](http://stackoverflow.com/questions/2775/whats-the-best-way-to-remove-the-time-portion-of-a-datetime-value-sql-server/3696991 #3696991)了解更多细节.

12> Somnath Mulu..:

如果您使用的是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?

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

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

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



13> 小智..:

如果你想使用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错误.



14> Gordon Bell..:
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方法.


请注意,前两个版本的"正确"版本是`select dateadd(dd,datediff(dd,0,getdate()),0)`因为`dd`可以被替换为任何[` datepart` keywords](http://msdn.microsoft.com/en-us/library/ms174420.aspx)在您选择的任何细分中剪辑日期.(另请注意,`dd`只是`day`的缩写.)

15> 小智..:

要获得指示的结果,我使用以下命令.

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

我说它很有用.



16> 小智..:
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

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



17> Art Schmidt..:

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03



18> bishnu karki..:

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

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



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


此建议已被其他答案覆盖(不止一次)。

20> Krishnraj Ra..:

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

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



21> Matt O'Brien..:

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

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



22> Kris Khairal..:

日期:

SELECT CONVERT(日期,GETDATE())
SELECT CAST(GETDATE()作为日期)

时间:

SELECT CONVERT(时间,GETDATE(),114)
SELECT CAST(GETDATE()作为时间)



23> 小智..:

只需执行以下操作即可:

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有