如何仅返回SQL Server日期时间数据类型中的日期

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

1
SELECT GETDATE()

2008-09-22 15:24:13.790时返回。 </P >

我想看到的日期部分无时部分:2008-09-22 00:00:00.000 </P >

如何我能得到那??????? </P >

  • 如果您希望在没有时间的情况下获得日期数据类型,即使时间是00:00:00,那么您也不走运,您可以获得varchar,但结构是日期时间,并且您总是有一些时间。
  • 需要注意的一点是,SQLServer2008包含一个单独的日期数据类型,用于只存储没有时间组件的日期。此处提供更多信息:sql server performance.com/articles/dev/datetime_2008_p1.asp‌&8203;x
  • 不要错过显示各种时间消除方法性能测试结果的帖子。
  • @马丁很奇怪,谢谢,让我们再试一次。
  • 不要被投票和接受的答案误导,看看stackoverflow.com/a/126984/1155650。
  • @Rohit并非每个人都有SQL Server 2008或更高版本。
  • @泰格纳-这肯定是误导了那些有。还有一个低于2008年的版本(即:2005年),在2008年之后,我们有4个版本并且还在计算中。
  • @Rohit你错误地认为2008年是人们唯一关心的版本。(在野外有更多的版本。)投票代表他们自己。
  • 你错误地认为2008年是人们唯一关心的版本。(在野外有更多的版本。)投票代表他们自己。


SQL Server 2008及更高版本上,您应在CONVERT至目前为止:

1
SELECT CONVERT(DATE, getdate())

在旧版本上,可以执行以下操作:

1
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

例如

1
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

给我

1
2008-09-22 00:00:00.000

赞成的意见:

  • 不需要varchar<->datetime转换
  • 不需要考虑locale


按照迈克尔的建议

使用这个变种:SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

  • 这种方法比使用其他建议的转换方法更好还是更差?还是可以忽略不计?
  • 我的方法更快。它不需要转换为varchar并允许有效的日期计算
  • +1看起来这个方法比通常使用的double convert()方法(我也用了很多年)快35%。很好。
  • 如果这比convert方法快35%,您一定会想知道内置的截断会快多少——这必须是我做过的最常见的与日期时间相关的操作——我将看到如何切换到这个机制。
  • 我能看到的唯一的缺点是,除非你知道它在做什么,否则它有点迟钝。使用双重转换方法使您的意图对未来的代码维护者更加明显。顺便说一句,我没有对你投反对票。我想我也会用你的方法。谢谢你
  • +1您可能有兴趣看到RicardoC编辑的答案(因为它是社区wiki,事实上不正确,所以我更正了它)。你的问题也得到了支持。
  • 也不要错过显示性能测试结果的帖子。
  • @Pilavdzice将日期时间设置为当天的午夜,这确实会使时间中断。你期待什么结果?datetime数据类型不能完全没有时间。我认为您将数据存储与用户演示混淆了。如果您只想向用户显示一个没有时间部分(不是零,只是空白)的字符串,那么您只需要Convert(varchar(30), @Date, 101)或类似的东西。查看SQL Server联机丛书?强制转换以获取更多信息。
  • 值得注意的是,这并不延伸到汇总月度或年度数据。你必须修改条款才能生效。选择日期添加(mm,datediff(mm,0,@yourdate),0)可扩展为mm/yy IIRC
  • @AKU有一种方法可以只获取日期部分,即"2008-09-22",而不是"2008-09-22 00:00:00.000",而不将其转换为varchar。现在我用的是CONVERT(VARCHAR(10), @dateTime, 101) AS MyDate
  • @user1671639日期时间数据类型总是同时包含日期和时间,如果不使用SQL Server 2008,就不能明智地存储其中的一个-在这种情况下,还存在单独的"日期"和"时间"数据类型。如果您使用convert()这样的方法,那么您真的需要一个字符串供以后使用,因此您将不得不这样做——尽管如果您使用日期格式函数而不是关闭日期会更好——或者通过CAST(... AS DATE)CONVERT(DATE, ...),这在本页中经常提到。
  • 我建议将答案改为SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0),因为这样可以将dd替换为任何其他datepart关键字,以在任意级别截断您的datetime
  • 亲爱的@aku请帮我解答这个问题,stackoverflow.com/questions/51887163/&hellip;谢谢!
  • 从表中选择cast(createddate as date),其中createdate是日期时间列


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

1
SELECT CONVERT(DATE, getdate())

  • sql2008中还有"time"数据类型,它回答了日期和时间分隔问题的另一半。
  • 仅供参考,我基准化了不同的方法,从日期削减时间,这是最快的方法。虽然差别不大,但显然比大量处决要快。
  • 关于SQLServer2005??
  • @Maf博士完成了这个循环,2008年前的答案是:stackoverflow.com/questions/113045/&hellip;


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

1
SELECT CAST(getdate() AS DATE)

  • 消息243,级别16,状态1,行1类型日期不是定义的系统类型。
  • @弗雷德里克高斯:什么类型,日期?您使用什么版本的SQL Server?
  • 当心!declare@date1 datetime='2015-09-30 20:59:59.999';select cast(@date1 as date)返回'2015-10-01'
  • @尼克:是吗?sqlfiddle.com/!6/9EECB7/2732
  • @阿巴蒂什切夫,对不起,那应该是埃多克斯。
  • @尼克:这是日期时间的问题。用DateTime2代替,效果很好。sqlfiddle.com/!6/9EECB7/2833
  • @尼克,作为Abatishchev回复的补充,由于DateTime的限制,您的@date1实际上是2015-10-01。试着不给Date铸造,它也会产生2015-10-01declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
  • 其中一个简单易记的SQL技巧。正如迈克所说,只有2008年以后,但如果你在某个地方找到2005年和以前的数据库,你可能会遇到很多问题:)
  • @我相信在2016年底运行SQL Server 2005的原因完全是0。这纯粹是白痴,不是吗?一个很好的迹象表明那里出了严重的问题。
  • 我喜欢使用ansi-std"cast()"—如果现在的可移植性是一个问题(甚至是可以实现的):。如果想要保持精确性,也可以选择:msdn.microsoft.com/en-us/library/ms187928.aspx
  • @Abatischchev-1原因:管理层拒绝批准更新古董的预算,只要有人能让古董继续运行。即使在Windows2000上运行的SQL Server2000仍然是活动的。SQLServer2005Express:仅在我的公司中就有大约50个实例(不,不是我的,是我为之工作的实例)。
  • "2015-09-30 20:59:59.999"问题似乎不再适用于SQL Server 2016。
  • 通过使用SELECT CAST(CURRENT_TIMESTAMP AS DATE)(CURRENT_TIMESTAMP相当于GETDATE(),人们可以更进一步地使用ANSI标准。


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

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

1
2
SET showplan_text ON
GO

dateadd和datediff都将执行convert_隐式。

虽然转换解决方案对某些人来说更简单、更容易阅读,但速度较慢。不需要强制转换回datetime(这是由服务器隐式完成的)。在datediff方法中,也不需要在后面使用dateadd,因为整数结果也将隐式转换回datetime。

选择convert(varchar,mydate,101)from datestab

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

从datestab中选择dateadd(dd,0,datediff(dd,0,mydate))。

1
2
  |--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 recommended使用floor()的性能更接近于datediff,但不建议将datetime数据类型强制转换为float,而back并不总是生成原始值。

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

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

对于某些人来说,关于缓存优化何时影响查询似乎有些困惑。在同一批或不同批中运行两个查询对缓存没有影响。因此,您可以手动终止缓存,也可以简单地来回运行查询多次。对查询2的任何优化也会影响任何后续查询,因此如果愿意,可以抛出执行1。

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

  • 里卡多·C,很好的调查!您使用什么版本的SQL Server?在带有datediff的mssql2000方法上,我的执行速度稍快。
  • 只是要注意,我做了1000.000次测试。我想,对于现实场景,性能差异是不明显的。
  • aku,我在这个测试中使用了SQL Server 2005 Express。我在2000年的工作中,我将用一个超过2400万行的表来测试它,然后看看会有什么结果。
  • 阿库,同样的结果。超过一千万行的性能没有差别。
  • 关于平等履行的主张是不正确的。当然,执行计划是一样的!!!!必须通过比较CPU使用率,而不是检查执行计划来衡量这些方面的性能。


试试这个:

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

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

  • 这是我的"2008/09/22"
  • 111是日文格式。YYY/MM/DD
  • 选择convert(varchar(10),getdate(),101)为mm/dd/yyyy格式。
  • 如果您是基于原始文本值(在数据库之外)进行排序,那么"日语"格式更好
  • 它在SQL Server 2005上工作。


1
SELECT CONVERT(datetime, CONVERT(VARCHAR, GETDATE(), 101))

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

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

铸造和转换

使用convert函数的语法是:

1
CONVERT ( data_type [ ( LENGTH ) ] , expression [ , STYLE ] )

以日期格式返回

CAST(OrderDate AS date)

上述代码将在SQL Server 2010中工作。

它会像2013年12月12日一样回来

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

1
CONVERT(VARCHAR(10), OrderDate , 111)

  • 这将返回零时间的日期,而不仅仅是日期
  • 如果您使用的是SQL Server,我可以知道哪个版本吗?
  • @maheshml以ms-sql 2012返回日期和时间。
  • @Marek它与MS SQL 2008一起工作正常
  • 在SQL Azure中的工作方式很迷人
  • @MaheshML没有像SQL Server 2010这样的东西。


1
2
3
4
5
6
7
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

使用floor()-只需切割时间部分。

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

  • 这种方法不是最快的,也含蓄地告诉人们,铸造日期浮动是准确的,而不是。详情请参阅本帖。
  • 浮点量化误差是可怕的


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

使用FORMAT()功能。

SQL Server已经有多个答案和格式类型。但大多数方法都有点含糊不清,您很难记住格式类型或函数相对于特定日期格式的数字。这就是为什么在下一个版本的SQL Server中有更好的选择。

1
FORMAT ( VALUE, format [, culture ] )

区域性选项非常有用,因为您可以根据查看者指定日期。

你必须记住d(小模式)和d(长模式)。

1."D"-短日期模式。

1
2
3
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"-长日期模式。

1
2
3
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)

查询中的更多示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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        2011101

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

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

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

    如果我能用一下Soapbox,这种格式就不属于数据层,这就是为什么在引入实际的日期部分数据类型之前,没有愚蠢的高开销"技巧"是不可能的。在数据层中进行这样的转换是对DBMS的巨大开销,但更重要的是,当您这样做时,基本上已经在内存中创建了孤立的数据,我认为您将返回到程序。您不能将它放回另一个3nf+列中,或者在不进行恢复的情况下将其与任何类型的列进行比较,因此您所做的只是引入故障点并删除关系引用。

    您应该始终继续并将日期时间数据类型返回到调用程序,在表示层中,进行任何必要的调整。在将它们返回给调用者之前,一旦转换了它们,应用程序就不再希望引用完整性了。这将再次阻止更新或删除操作,除非您执行某种手动恢复操作,当不需要时,这会再次将您的数据暴露于human/code/gremlin错误中。

    • 但是,如果您希望查询检索与用户提供的日期匹配的所有记录作为特定时间字段的日期部分,则可以这样做。祝你只在演示层中这样做。(您不需要转换,您可以使用日期算术,但您得到了这个想法…)
    • @安德鲁,为什么这么重要?你说WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);——完全没有理由剥夺专栏的时间。
    • @aaronbertrand只在假设输入@Date的时间部分为零的情况下工作。如果不是这样,您仍然需要知道如何截断服务器端的时间。我同意这个答案,即格式应该留给表示层,但我不同意这样一种含义:将格式留给前端意味着您不必知道一种快速的截断方法。
    • @安德鲁,你所要做的就是输入参数日期。我的观点仍然是,即使这是大多数人的第一反应,您也不应该对列应用任何这样的截断。
    • @aaronbertrand,假设您可以控制参数的数据类型。在存储过程中是可以的,在其他情况下是不可能的。为什么不强制转换以确保参数是您想要和需要的类型?
    • @又是安德鲁,没关系。我再说一次,我的观点是你不应该非得投这个柱子。请阅读。


    1
    2
    3
    4
    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))

    编辑:前两个方法基本相同,out执行convert to varchar方法。

    • 这些方法都很好,但您建议使用哪一种方法?
    • 请注意,前两个的"正确"版本是select dateadd(dd, datediff(dd, 0, getdate()), 0),因为dd可以被替换为任何datepart关键字,以便在您选择的任何段中剪辑日期。(还要注意,dd只是day的缩写。)


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

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

    我觉得它很有用。


    如果需要varchar数据类型的结果,您应该

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

    上面已经提到了

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

    1)截止日期:2014-03-26 00:00:00.000

    2)截止日期:2014-03-26 00:00:00.000

    3)

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

    --2014年3月26日00:00:00.000


    1
    2
    3
     CONVERT(nvarchar(10), getdate(), 101) --->  5/12/14

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

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

    1
    2
    3
    DECLARE @DATE DATE = GETDATE()  

    SELECT @DATE   --> 2017-05-03

    好吧,尽管我有点晚了:)这是另一个解决办法。

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

    结果

    1
    2008-09-22 00:00:00.000

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

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

    • 第一个例子仍然有一个时间组件。问题的关键是如何消除它。


    我认为这在你的情况下是可行的:

    1
    2
    CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
    //here DATE IS obtained AS 1990/09/25

    即使使用古老的MSSQLServer7.0,这里的代码(由这个链接提供)也允许我获取当时正在寻找的任何日期格式:

    1
    2
    3
    4
    5
    6
    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
    2
    3
    4
    5
    6
    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

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

    • 请解释一下你的答案是怎么回事。
    • 这一建议已被其他答案所涵盖(不止一次)。


    戴特:

    1
    2
    SELECT CONVERT(DATE, GETDATE())
    SELECT CAST(GETDATE() AS DATE)

    时间:

    1
    2
    SELECT CONVERT(TIME , GETDATE() , 114)
    SELECT CAST(GETDATE() AS TIME)

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

    1
    2
    3
    SELECT CONVERT(DATE, getdate())
    SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
    SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

    输出为:

    1
    2008-09-22 00:00:00.000

    或者简单地这样做:

    1
    SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

    结果:

    1
    2
    3
    DATE Part ONLY
    --------------
    2013-07-14

    • 我怎样才能只得到年度部分?


    在SQL Server 2000上

    1
    2
    3
    4
    5
    6
    7
    CAST(
    (
        STR( YEAR( GETDATE() ) ) + '/' +
        STR( MONTH( GETDATE() ) ) + '/' +
        STR( DAY( GETDATE() ) )
    )
    AS DATETIME)


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

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

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


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

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


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

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

    我知道这很古老,但我不知道在哪里有人这样说。据我所知,这是ANSI标准。

    1
    SELECT CAST(CURRENT_TIMESTAMP AS DATE)

    如果微软也能支持ANSI标准的当前日期变量,那就更好了。


    为什么不使用日期格式(您的"日期"列,"%d-%m-%y")?

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

    您可以通过重新安排'%d-%m-%Y'部分来更改m、d和year的顺序。


    日期(日期和时间字段)和日期格式(日期和时间,"%y-%m-%d")都只返回日期和时间

    • 此问题表示SQL Server。这看起来像mysql?


    试试这个:

    1
    SELECT CONVERT(DATE, GETDATE()) AS DATE

    • 给出一些解释,以便理解解决方案


    我常用的方法是不带时间段的约会。

    1
    2
    3
     SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

     SELECT CAST(GETDATE() AS DATE)

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

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

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

    datepart=>返回表示指定日期的指定日期部分的整数。

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


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


    我的风格

    1
          SELECT CONVERT(smalldatetime,CONVERT(INT,CONVERT(FLOAT,getdate())))

    如果使用SQL 2008及更高版本:SELECT CONVERT(DATE ,GETDATE())

    • 它对我有用!谢谢莫特扎。


    选择Convert(日期,getDate())


    您只需使用下面的代码获取日期部分并避免SQL中的时间部分:

    1
    SELECT SYSDATE TODAY FROM DUAL;

    • 这是用于Oracle的命令,而不是MS SQL。
    • 它不仅适用于Oracle,也不适用于MS SQL——甚至不正确。要只从Oracle获取日期部分,可以使用TRUNC(SYSDATE)


    选择convert(getdate()作为daselect convert(datetime,convert(date,getdate())te)


    1
    SELECT CAST(createddate AS DATE) AS derivedate FROM TABLE

    createDate是日期时间列,适用于sqlserver


    您可以如下所示仅用于不同类型的日期输出

  • SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))年—月—日

  • SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))——年/月/日

  • SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))