如何只返回 SQLServerDateTime 数据类型中的 Date

SELECT GETDATE()

返回: 2008-09-22 15:24:13.790

我想要那个没有时间的约会部分: 2008-09-22 00:00:00.000

我怎么才能拿到?

3431706 次浏览

试试这个:

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

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

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
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转换
  • 不需要考虑语言环境

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

SQLServer 2000中的日期和时间操作

CAST和CONVERT

使用转换函数的语法是:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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方法。

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

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

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

要查看查询的执行计划:

set showplan_text onGO

DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。

虽然CONVERT解决方案对某些人来说更简单,更容易阅读,但它慢。不需要转换回DateTime(这是由服务器隐式完成的)。之后在DateAdd的DateDiff方法中也没有真正的需要,因为整数结果也将隐式转换回DateTime。


选择转换(varchar, MyDate,101)从DatesTable

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

从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的建议使用FLOOR()具有更接近DateDiff的性能,但不推荐使用,因为将DateTime数据类型转换为浮点数并返回并不总是产生原始值。

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

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

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

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

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

SELECT CONVERT(date, GETDATE())

如果使用SQL2008及以上:

select cast(getdate() as date)
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

如果您想使用CONVERT并获得与原始问题相同的输出,即yyyy-mm-dd,则使用CONVERT(varchar(10),[SourceDate as dateTime],121)与前一对答案相同的代码,但使用破折号转换为yyyy-mm-dd的代码是121。

如果我能在我的肥皂盒上呆一会儿,这种格式不属于数据层,这就是为什么直到SQLServer 2008引入实际的datepart数据类型时,没有愚蠢的高开销“技巧”是不可能的。在数据层进行此类转换是对DBMS开销的巨大浪费,但更重要的是,当你做这样的事情时,你基本上创建了内存中的孤立数据,我假设你将随后返回到程序中。你不能将其放回另一个3NF+列或将其与任何类型的数据进行比较而不恢复,所以你所做的只是引入故障点和删除关系引用。

您应该始终继续并将您的dateTime数据类型返回给调用程序和在演示层,做任何必要的调整。一旦您在将内容返回给调用者之前进行转换,您就会从应用程序中消除所有引用完整性的希望。这将再次阻止UPDATE或DELETE操作,除非您进行某种手动还原,这再次将您的数据暴露给不需要的人为/代码/gremlin错误。

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

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

我认为它是有用的。

我认为这将在你的情况下工作:

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

以日期格式返回

CAST(OrderDate作为日期)

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

它将返回喜欢12/12/2013

SQLServer 2012使用下面的代码

CONVERT(VARCHAR(10), OrderDate , 111)

如果你需要结果varchar,你应该通过

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

上面已经提到了。

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

  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 DATETIMESET@OnlyDate=DATEDIFF(DD,0, GETDATE())获取日期选择@OnlyDate作为OnlyDate

    2014-03-26 00:00:00.000

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

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

DATEPART()函数用于返回日期/时间的单个部分,例如年、月、日、小时、分钟等。

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

CONVERT()=>CONVERT()函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。的CONVERT()函数可用于以不同格式显示日期/时间数据。

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

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

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

即使使用古老的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:14PM2) Date/time in format MM-DD-YY: 02-27-153) Date/time in format MM-DD-YYYY: 02-27-20154) Date/time in format DD MON YYYY: 27 Feb 20155) Date/time in format DD MON YY: 27 Feb 156) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

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

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

它也不关心本地或进行双重转换-尽管每个'datepart'可能都会进行数学运算。所以它可能比datadiff方法慢一点,但对我来说它更清晰。特别是当我只想按年和月分组时(将日期设置为1)。

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

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

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

如果微软也能支持ANSI标准CURRENT_DATE变量,那就太好了。

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

SELECT SYSDATE TODAY FROM DUAL;

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

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

结果

2008-09-22 00:00:00.000

如果您使用的是SQLServer 2012及更高版本,那么您可以使用FORMAT()函数,如下所示-

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

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

DECLARE @Date DATE = GETDATE()
SELECT @Date   --> 2017-05-03

日期:

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

时间:

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

SQLServer 2000

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

从SQL服务器2012开始,您可以这样做:

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

如果你使用SQLServer 2012或以上版本

使用#0函数。

服务器已经有多个答案和格式类型SQL。但是大多数方法都有些模棱两可,你很难记住格式类型的数字或特定日期格式的函数。这就是为什么在SQL服务器的下一个版本中有更好的选择。

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. 自定义日期和时间格式字符串

你可以简单地这样做:

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

我的常用方法是在没有时间部分的情况下获得日期。

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
select convert(getdate() as date)
select CONVERT(datetime,CONVERT(date, getdate()))

我的风格

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
select cast(createddate as date) as derivedate from table

createdate是您的日期时间列,这适用于sqlserver

您可以使用像下面的不同类型的输出日期只

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))-----dd/mm/yyyy

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))----mm/dd/yyyy

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

哇,让我数一数你能做到这一点的方法。

为了得到你想要的结果在这种格式具体:

2008-09-22

这里有几个选择。

SELECT CAST(GETDATE() AS DATE) AS 'Date1'SELECT Date2  = CONVERT(DATE, GETDATE())SELECT CONVERT(DATE, GETDATE()) AS 'Date3'SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

所以,我建议选择一个你觉得舒服的,并在你所有的桌子上全面使用这种方法。

所有这些选项都以完全相同的格式返回日期。为什么SQL服务器有这样的冗余?

我不知道,但他们知道。也许比我聪明的人能回答这个问题。

希望这有助于某人。

最简单的方法是使用:SELECT DATE(GETDATE())

如果您希望日期显示2008-09-22 00:00:00.000

然后你可以用

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

这将显示问题格式中的日期

在这种情况下,仅限日期,我们将运行此查询:

选择转换(VARCHAR(10), getdate(),111);输入图片描述

只要做到:

SELECT CAST(date_variable AS date)

或者使用PostgreSQL:

SELECT date_variable::date

这被称为类型转换btw!

由于自从这个问题有了答案以来发生了许多变化,我想提供一种新的方法来获得请求的结果。有两种方法来解析DATETIME数据。首先,要获取这个问题所问的日期:

DATEVALUE([TableColumnName])

其次,从值中获取时间:

TIMEVALUE([TableColumnName])

示例:

表:客户

列:CreationDate作为DateTime

【客户】。【创建日期】:2020年2月7日09:50:00

DATEVALUE([Customers].[CreationDate]) '--> Output: 2/7/2020TIMEVALUE([Customers].[CreationDate]) '--> Output: 09:50:00

我希望这对我有帮助,因为我搜索了一段时间,找到了这个问题中看到的许多答案,但没有一个有效。IECASTCONVERT

编码快乐!

语法:

SELECT CONVERT (data_type(length)),Date, DateFormatCode)

例如:

Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]

关于Date的所有日期格式代码:

DateFormatCode  Format1       [MM/DD/YY]2       [YY.MM.DD]3       [DD/MM/YY]4       [DD.MM.YY]5       [DD-MM-YY]6       [DD MMM YY]7       [MMM DD,YY]10      [MM-DD-YY]11      [YY/MM/DD]12      [YYMMDD]23      [yyyy-mm-dd]101     [MM/DD/YYYY]102     [YYYY.MM.DD]103     [DD/MM/YYYY]104     [DD/MM/YYYY]105     [DD/MM/YYYY]106     [DD MMM YYYY]107     [MMM DD,YYYY]110     [MM-DD-YYYY]111     [YYYY/MM/DD]112     [YYYYMMDD]

从SQLServer 2022(16. x)开始,另一个选项是DATETRUNC()函数,使用day作为datepart参数的值:

SELECT DATETRUNC(day, GETDATE());