如何仅返回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 >


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


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

1
SELECT CONVERT(DATE, getdate())


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

1
SELECT CAST(getdate() AS DATE)


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快得多。


试试这个:

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

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


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)


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错误中。


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


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

    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")都只返回日期和时间


    试试这个:

    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;


    选择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))