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

How to return only the Date from a SQL Server DateTime datatype

提问人:Eddie Groves 提问时间:9/22/2008 最后编辑:Shu RahmanEddie Groves 更新时间:3/25/2023 访问量:3617272

问:

SELECT GETDATE()

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

我想要没有时间部分的日期部分:2008-09-22 00:00:00.000

我怎样才能得到它?

SQL 日期时间 sql-server-2008

评论

21赞 Ben Hoffstein 9/22/2008
需要注意的一点是,SQL Server 2008 包含一个单独的 DATE 数据类型,用于仅存储日期而不存储时间组件。更多信息在这里: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
7赞 ErikE 8/18/2012
不要错过这篇文章,它展示了各种时间删除方法的性能测试结果。
3赞 Aaron Bertrand 11/18/2013
@Martin奇怪,谢谢,让我们再试一次
21赞 Rohit Vipin Mathews 11/26/2013
不要被投票和接受的答案误导,看看 stackoverflow.com/a/126984/1155650
8赞 hktegner 12/15/2013
@Rohit 你错误地认为 2008 年是人们关心的唯一版本。(在野外还有更多版本。选票不言自明。

答:

61赞 Nescio 9/22/2008 #1

试试这个:

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

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

评论

5赞 Eddie Groves 9/22/2008
这为我返回“2008/09/22”
3赞 Flea 7/11/2013
选择 CONVERT(VARCHAR(10),GETDATE(),101) 是格式。mm/dd/yyyy
5赞 Simon_Weaver 9/14/2013
如果您根据原始文本值(在数据库之外)进行排序,则“日语”格式更好
50赞 Cade Roux 9/22/2008 #2
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
2838赞 aku 9/22/2008 #3

注意:此答案返回原始 DATETIMEDATETIME2 类型。有关返回 true DATE 类型的表达式(SQL Server 2008 及更高版本),请参阅下面的 BenR 答案。

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 转换
  • 无需考虑语言环境

评论

63赞 Dane 9/22/2008
+1 看起来这个方法比常用的 double convert() 方法快 35%(我也使用了多年)。好东西。
8赞 Jim Birchall 9/24/2008
我能看到你的解决方案的唯一缺点是,除非你知道它在做什么,否则它有点迟钝。使用双重转换方法可以使您的意图对未来的代码维护者更加明显。顺便说一句,我没有对你投反对票。我想我也会开始使用你的方法。谢谢@aku
41赞 ErikE 8/18/2012
@pilavdzice 将日期时间设置为当天的午夜确实会忽略时间。你期待什么结果?数据类型不能完全没有时间。我认为您将数据存储与用户演示混淆了。如果你想要的只是向用户显示一个没有时间部分(不是零,只是空白)的字符串,那么你只需要或类似的东西。有关详细信息,请参阅 SQL Server 联机丛书 • 强制转换datetimeConvert(varchar(30), @Date, 101)
8赞 Magnus 6/21/2013
@user1671639 datetime 数据类型始终同时包含日期和时间,因此不能合理地存储一个而没有另一个 - 除非您使用的是 SQL Server 2008,在这种情况下,还有单独的“date”和“time”数据类型。如果你像这样使用 CONVERT(),你真的想要一个字符串供以后使用,所以你会被困在这样做中——尽管如果你使用日期格式化函数而不是切断日期会更好——或者通过 or ,这在这个页面上经常被提及。CAST(... AS DATE)CONVERT(DATE, ...)
12赞 Michael 8/15/2014
我建议将答案更改为,因为这样可以换成任何其他 datepart 关键字,以在任意级别截断您的。SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)dddatetime
25赞 DaveK 9/22/2008 #4

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

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

投射和转换

使用 convert 函数的语法为:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
15赞 Gordon Bell 9/22/2008 #5
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方法。

评论

1赞 Eddie Groves 9/22/2008
这些方法都很棒,但是您建议使用哪一种呢?
3赞 Michael 8/15/2014
请注意,前两个的“正确”版本是 ,因为 s 可以换成任何 datepart 关键字,以在您选择的任何段上裁剪日期。(另请注意,这只是 的缩写。select dateadd(dd, datediff(dd, 0, getdate()), 0)ddddday
0赞 Tom BK Cz 4/20/2023
请注意,使用新DATETIME2,此截断并非每次都能正确工作: 结果如下 orig_date: 2020-12-31 23:59:59.9989110 truncated_date: 2021-01-01 00:00:00.000DECLARE @myDate DATETIME2 = '2020-12-31 23:59:59.998911';SELECT @myDate AS orig_date, DATEADD(dd, 0, DATEDIFF(dd, 0, @myDate)) AS truncated_date
17赞 DiGi 9/22/2008 #6

使用 FLOOR() - 只需剪切时间部分。

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

评论

4赞 ErikE 9/13/2010
这种方法不是最快的,而且还隐含地告诉人们,将日期投射到浮动是准确的,但事实并非如此。有关更多详细信息,请参阅此帖子
87赞 11 revs, 7 users 70%Ricardo C #7

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

若要查看查询的执行计划,请执行以下操作:

set showplan_text on
GO 

DATEADD 和 DATEDIFF 都将执行CONVERT_IMPLICIT。

尽管 CONVERT 解决方案对某些人来说更简单、更易于阅读,但它的速度较慢。无需强制转换回 DateTime(这是由服务器隐式完成的)。之后,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]))

按照@digi建议使用 FLOOR() 具有更接近 DateDiff 的性能,但不建议这样做,因为将 DateTime 数据类型转换为浮点数并返回并不总是产生原始值。

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

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

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

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

评论

0赞 aku 9/24/2008
里卡多C,很好的调查!您使用的是哪个版本的 SQL Server?在MSSQL2000带有 datediff 的方法对我来说执行得稍微快一些。
0赞 aku 9/24/2008
请注意,我进行了 1000.000 次测试。对于实际场景,我猜性能差异不会很明显
0赞 Ricardo C 9/24/2008
Aku,我使用了 SQL Server 2005 Express 进行此测试。我在工作中研究 2000 年,我将用一个超过 2400 万行的表来测试它,看看结果如何。
0赞 Ricardo C 9/25/2008
阿库,同样的结果。超过一千万行的性能没有差异。
7赞 ErikE 9/13/2010
关于同等性能的说法是不正确的。当然,执行计划是一样的!!必须通过比较 CPU 使用率来衡量这些性能,而不是检查执行计划。
928赞 BenR 9/24/2008 #8

SQLServer 2008 现在具有“date”数据类型,该数据类型仅包含日期,不包含时间部分。使用 SQLServer 2008 及更高版本的任何人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())

评论

47赞 misteraidan 8/25/2011
SQL2008中还有“时间”数据类型,它回答了分离日期和时间问题的另一半。
10赞 UnhandledExcepSean 7/3/2014
仅供参考,我对从日期中修剪时间的不同方法进行了基准测试,这是最快的方法。当然,差异很小,但显然比 # 大执行更快。
2赞 Dr. MAF 11/19/2015
WT 关于 SQLServer 2005??
0赞 Frosty840 7/31/2017
@Dr.MAF 完成这个圈子,2008 年之前的答案就在这里:stackoverflow.com/questions/113045/......
0赞 variable 2/2/2022
在 SQL 2019 中,首选是什么 - 此答案还是 CAST 或 CONVERT?
235赞 abatishchev 1/31/2011 #9

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

select cast(getdate() as date)

评论

3赞 abatishchev 12/14/2012
@FredrickGauss:什么类型,日期?您使用的是哪个版本的 SQL Server?
8赞 Nick 9/25/2015
小心!声明@date1日期时间 = '2015-09-30 20:59:59.999';select cast(@date1 as date) 返回“2015-10-01”
8赞 abatishchev 9/25/2015
@Nick:这是 DateTime 的问题。改用,效果很好。sqlfiddle.com/#!6/9eecb7/2833DateTime2
10赞 Frédéric 12/12/2015
@Nick,为了补充 Abatishchev 的回应,由于限制,您的@date1确实是 。尝试没有任何投射,它也屈服了!2015-10-01DateTimeDate2015-10-01declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1 => 2015-10-01
5赞 NicVerAZ 12/30/2015
这些易于记忆的 SQL 技巧之一。正如 Mike 所说,只有 2008 年以后,但是,如果您在某处找到 2005 年及以前的数据库,您可能会遇到很多问题:)
18赞 Rushda 9/22/2011 #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
15赞 Focusyn 7/27/2012 #11

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

如果我能在我的肥皂盒上一秒钟,这种格式不属于数据层,这就是为什么在 SQL Server 2008 引入实际的 datepart 数据类型之前,如果没有愚蠢的高开销“技巧”,就不可能实现。在数据层中进行此类转换会浪费 DBMS 的大量开销,但更重要的是,当您执行此类操作时,您基本上已经创建了内存中的孤立数据,我假设您将返回到程序中。你不能把它放在另一个 3NF+ 列中,或者在不还原的情况下将其与任何类型进行比较,所以你所做的只是引入故障点并删除关系引用。

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

评论

1赞 Andrew Lazarus 3/15/2013
例如,如果您想要一个查询来检索与用户提供的日期匹配的所有记录作为特定时间字段的日期部分,则除外。祝你好运,只在表示层中这样做。(你不需要转换,你可以使用日期算术,但你明白了......
1赞 Aaron Bertrand 11/16/2013
@Andrew为什么这很重要?你说 - 绝对没有理由从专栏中剥离时间。WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
1赞 Andrew Lazarus 11/17/2013
@AaronBertrand 这仅在输入具有零时间部分的情况下才有效。如果不是这样,您仍然需要知道如何在服务器端截断时间。我同意这个答案,即格式应该留给表示层,但我不同意将其留给前端意味着您不必知道快速截断的方法。@Date
1赞 Aaron Bertrand 11/17/2013
@Andrew您所要做的就是创建输入参数 DATE。我的观点仍然是,你永远不应该对应用任何这样的截断,尽管这是大多数人的第一本能。
1赞 Andrew Lazarus 11/19/2013
@AaronBertrand,假定您可以控制参数的数据类型。在存储过程中很好,在其他情况下则不然。为什么不强制转换以确保参数是您想要和需要的类型?
15赞 Anderson Silva 11/18/2013 #12

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

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

我认为它很有用。

8赞 bishnu karki 11/27/2013 #13

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
30赞 Mahesh ML 12/19/2013 #14

对于以日期格式返回

CAST(订单日期为日期)

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)

评论

1赞 Bohemian 1/5/2014
这会返回零时间的日期,而不仅仅是日期
1赞 Mahesh ML 3/19/2014
如果您使用的是 SQL Server,我能否知道哪个版本?
1赞 Marek 4/13/2014
@MaheshML它在 MS SQL 2012 中同时返回日期和时间。
1赞 Martín Coll 5/21/2014
在 SQL Azure 中像魅力一样工作
5赞 SvenAelterman 9/25/2017
@MaheshML 没有 SQL Server 2010 这样的东西。
24赞 Stephon Johns 3/26/2014 #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

5赞 user1151326 3/29/2014 #16

您可以对日期部分使用以下内容并设置日期格式:

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

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

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

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

11赞 Ankit Khetan 5/12/2014 #17
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
6赞 Janaka R Rajapaksha 5/17/2014 #18

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

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

您可以通过重新排列零件来更改 M、D 和年份的顺序'%d-%m-%Y'

8赞 etni 11/20/2014 #19
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

评论

2赞 Andriy M 11/20/2014
其他答案(不止一次)已经涵盖了这个建议。
7赞 tumultous_rooster 2/28/2015 #20

即使使用古老的 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
6赞 Gerard ONeill 5/1/2015 #21

我赞成以下未提及的内容:

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

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

4赞 Surekha 7/8/2015 #22

Date(date&time field) 和 DATE_FORMAT(date&time,'%Y-%m-%d') 都仅返回日期和时间中的日期

评论

1赞 The1nk 12/18/2015
问题陈述了 SQL Server。这似乎是MySQL?
4赞 Binitta Mary 9/1/2015 #23
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
6赞 lit 1/16/2016 #24

我知道这已经很老了,但我看不出有人这样说。据我所知,这是ANSI标准。

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

如果Microsoft也可以支持 ANSI 标准CURRENT_DATE变量,那就太好了。

评论

0赞 brianary 12/3/2019
select {fn current_date()} as today对我有用。
0赞 lit 12/9/2019
@brianary - 这很好,但它不是 ANSI SQL。
0赞 brianary 12/9/2019
这很公平,而且您的答案非常可移植,但我认为只要我们围绕 T-SQL 工作,这也有效(并表明实现 ANSI CURRENT_DATE对于 MS 来说是微不足道的)。
-1赞 Shyam Bhimani 3/30/2016 #25

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

SELECT SYSDATE TODAY FROM DUAL; 

评论

0赞 David Faber 3/24/2018
它不仅适用于 Oracle,不适用于 MS SQL——它甚至不正确。要仅从 Oracle 获取日期部分,请使用TRUNC(SYSDATE)
8赞 Krishnraj Rana 4/13/2016 #26

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

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

评论

0赞 Zack 4/21/2016
您的第一个示例仍然具有时间组件。问题的关键是如何消除它。
12赞 Art Schmidt 5/14/2016 #27

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
13赞 Kris Khairallah 5/21/2016 #28

日期:

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

时间:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)
5赞 r-magalhaes 5/24/2016 #29

在 SQL Server 2000 上

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
8赞 xbb 7/20/2016 #30

从 SQL SERVER 2012 开始,可以执行以下操作:

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

21赞 Somnath Muluk 8/24/2016 #31

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

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

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

评论

0赞 ourmandave 1/7/2021
要跳过区域性,自定义格式允许您设置自己的区域性,例如 得到 2011-10-11。FORMAT (@d, 'yyyyy-MM-dd')
0赞 Jeff Moden 5/5/2022
在任何情况下,在 SQL Server 中使用 FORMAT 都比您能想到的一些最疯狂的转换至少慢 20 倍。我会远离它的一切。
9赞 Amar Srivastava 9/8/2017 #32

简单地说,你可以这样做:

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
3赞 Spider 10/21/2017 #33

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

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
-1赞 mokh223 10/5/2018 #34
select convert(getdate() as date)

select CONVERT(datetime,CONVERT(date, getdate()))

评论

0赞 ChrisM 7/29/2019
我认为您已经复制了 2 个 select 语句,但在第一个 select 中复制了第二个 select。
0赞 Aubrey Love 9/29/2021
只有我的 2 美分价值,但第一个 SELECT 语句:“select convert(getdate() as date)”不起作用。“date”和“getdate()”应该像下面的代码一样反转。“SELECT CONVERT(DATE, GETDATE() )” 您也可以使用“CAST()”函数。任何一个都将返回相同的结果。“选择 CAST(GETDATE() AS DATE)”
2赞 CAGDAS AYDIN 11/21/2018 #35

我的风格

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
3赞 karthik kasubha 3/25/2019 #36
select cast(createddate as date) as derivedate from table 

createdate 是你的 datetime 列,这适用于 sqlserver

1赞 ankit soni 3/30/2019 #37

您可以像下面这样用于仅日期的不同不同类型的输出

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

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------月/日/年/年

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

1赞 Aubrey Love 4/24/2019 #38

哇,让我数一数你可以做到这一点的方法。(没有双关语的意思)

为了获得您想要的结果,具体来说,这种格式:

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 Server 具有这样的冗余?

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

希望这对某人有所帮助。

评论

0赞 Nosajimiki 7/17/2021
最后 3 个是被截断的完整日期时间戳。121 没有用“T”分隔,而其他两个则用“T”分隔。127 在处理DATETIME2格式时更精确,但对于常规日期时间,它们四舍五入为相同的值;因此,在不同的上下文中,它们返回 3 个不同的 datetime 值。至于第二个,A = B 的使用方式与 A AS B 使用除此以外的其他函数略有不同,但使用这些函数,它们的工作原理相同。至于 Convert vs Cast,Cast 是原生 ANSI 函数,而 Convert 是特定于 SQL 的。Convert 有更多选项,但并不总是性能如此出色。
-2赞 Jithin Joy 5/28/2019 #39

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

评论

1赞 Rohan Rao 1/6/2020
DATE 不是一个函数家伙。
1赞 Nosajimiki 7/17/2021
澄清一下...DATE() 是 mySQL 中的一个函数,但这个问题是关于 SQL Server 的。在 mySQL 中,您可以使用 DATE() 函数从日期时间元素中提取日期,使 DATE(“2021-06-15 09:34:21”) 返回 “2021-06-15”,但 GETDATE() 不是 mySQL 函数,因此他正在混合匹配 SQL 语言。在mySQL中等价的是DATE(NOW())...但是 mySQL 使这完全没有必要,因为您可以改为调用 CURDATE()。
0赞 MackM 3/29/2023
DATESnowflake 中的一个函数。
3赞 ChrisM 7/30/2019 #40

如果要显示日期2008-09-22 00:00:00.000

然后你可以使用四舍五入

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

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

9赞 Mohammad Neamul Islam 11/24/2019 #41

在本例中,仅日期,我们将运行以下查询:

选择 CONVERT(VARCHAR(10), getdate(), 111);在此处输入图像描述

32赞 John Sonnino 1/15/2020 #42

只需做:

SELECT CAST(date_variable AS date)

或与 PostgreSQL 一起使用:

SELECT date_variable::date

顺便说一句,这被称为类型转换!

-1赞 Christopher Warrington 2/8/2020 #43

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

DATEVALUE([TableColumnName])

其次,从值中获取时间:

TIMEVALUE([TableColumnName])

例:

表:客户

列:CreationDate 作为 DateTime

[客户]。[创建日期]: 2/7/2020 09:50:00

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

我希望这会有所帮助,因为我搜索了一段时间,并找到了这个问题中所看到的许多答案,但没有一个有效。IE 和 .CASTCONVERT

祝您编码愉快!

11赞 yusuf hayırsever 3/9/2021 #44

语法:

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]

所有 DateFormatcodes 关于 Date:

DateFormatCode  Format
1       [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]

评论

0赞 Konrad Viltersten 8/7/2022
+1 表示简洁的信息(可能没有优化性能,但清晰有用)。如果您可以发布指向转换代码参考的链接,那就更好了。最佳情况下,如果可能的话,提供一种方法来选择自己的、可自定义的格式(例如,如何获取 dd-yy-mm),并将时间部分合并到格式中(例如,如何获取 yyyy-hh-ss,无论这有多奇怪)。
4赞 Zhorov 9/1/2022 #45

从 SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.DATETRUNC()daydatepart

SELECT DATETRUNC(day, GETDATE());
0赞 Hongjin Zhu 2/15/2023 #46
SELECT CONVERT(varchar(100), GETDATE(), 102); --2023.02.15
SELECT CONVERT(varchar(100), GETDATE(), 23);  --2023-02-15

你可以通过这个网址来查找其他格式

例:在此处输入图像描述

https://www.cnblogs.com/wintuzi/p/16164124.html

希望我能帮到你