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

时间:2008-09-22 03:31:33

标签: sql sql-server tsql date datetime

SELECT GETDATE()

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

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

我怎么能得到它?

48 个答案:

答案 0 :(得分:2305)

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

根据Michael

的建议

使用此变体:SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

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

输出:

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

答案 1 :(得分:690)

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

SELECT CONVERT(date, GETDATE())

答案 2 :(得分:156)

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

select cast(getdate() as date)

答案 3 :(得分:70)

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

查看查询的执行计划:

set showplan_text on
GO 

DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT。

尽管CONVERT解决方案对某些人来说更简单易读,但 更慢。无需强制转换回日期时间(这由服务器隐式完成)。之后DateDiff方法中也没有真正需要DateAdd,因为整数结果也会被隐式转换回日期时间。


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。

以下full test script and performance results证明DateDiff比转换为varchar要快得多。

答案 4 :(得分:45)

试试这个:

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

上述语句会将您当前的格式转换为YYYY/MM/DD,请参阅this link以选择您喜欢的格式。

答案 5 :(得分:37)

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

答案 6 :(得分:19)

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

Date and Time Manipulation in SQL Server 2000

CAST and CONVERT

使用convert函数的语法是:

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

答案 7 :(得分:18)

以日期格式返回

  

CAST(OrderDate AS date)

以上代码适用于sql server 2010

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

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

CONVERT(VARCHAR(10), OrderDate , 111)

答案 8 :(得分:13)

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

答案 9 :(得分:12)

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

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

答案 10 :(得分:12)

如果您使用 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. Standard Date and Time Format Strings
  2. Custom Date and Time Format Strings

答案 11 :(得分:11)

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

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

您应该始终将dateTime数据类型返回到调用程序,并在PRESENTATION层中将 返回,进行必要的调整。 一旦转换在将它们返回给调用者之前,您正在从应用程序中删除所有参照完整性的希望。这将再次阻止UPDATE或DELETE操作,除非您进行某种手动还原,这在需要时再次将您的数据暴露给human / code / gremlin错误。

答案 12 :(得分:10)

如果你需要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

答案 13 :(得分:10)

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

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

我说它很有用。

答案 14 :(得分:10)

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

答案 15 :(得分:8)

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

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

答案 16 :(得分:7)

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

答案 17 :(得分:6)

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

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

答案 18 :(得分:6)

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

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

答案 19 :(得分:5)

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

答案 20 :(得分:5)

即使使用古老的MSSQL Server 7.0,这里的代码(由link提供)也允许我获得当时正在寻找的日期格式:

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

答案 21 :(得分:4)

只需:

SELECT CAST(date_variable AS date)

或与PostgreSQL一起使用:

SELECT date_variable::date

答案 22 :(得分:4)

只需你可以这样做:

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

答案 23 :(得分:4)

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

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

它也不关心本地或进行双重转换 - 尽管每个&lt; datepart&#39;可能是数学。所以它可能比dateiff方法慢一点,但对我来说它更清楚。特别是当我想按年份和月份分组时(将日期设置为1)。

答案 24 :(得分:4)

从SQL SERVER 2012开始,您可以这样做:

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

答案 25 :(得分:4)

在SQL Server 2000上

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

答案 26 :(得分:4)

日期:

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

时间:

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

答案 27 :(得分:3)

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

如果Microsoft也支持ANSI标准CURRENT_DATE变量,那将是件好事。

答案 28 :(得分:3)

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

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

答案 29 :(得分:3)

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

答案 30 :(得分:2)

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

答案 31 :(得分:2)

日期(日期和时间字段) DATE_FORMAT(日期和时间,&#39;%Y-%m-%d&#39;)都返回<从日期和时间开始强>唯一日期

答案 32 :(得分:2)

我在没有时间的情况下获得约会的常用方法..

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

 SELECT CAST(GETDATE() AS DATE)

答案 33 :(得分:2)

尝试一下:

SELECT CONVERT(date, GETDATE()) as date

答案 34 :(得分:2)

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

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

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

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

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

答案 35 :(得分:1)

语法:

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]

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

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]

答案 36 :(得分:1)

我的风格

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))

答案 37 :(得分:1)

在这种情况下,仅日期,您将运行以下查询:

SELECT CONVERT(VARCHAR(10),getdate(),111); enter image description here

答案 38 :(得分:1)

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

答案 39 :(得分:1)

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

然后您可以使用

对其进行四舍五入
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

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

答案 40 :(得分:0)

select cast(createddate as date) as derivedate from table 

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

答案 41 :(得分:0)

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

DATEVALUE([TableColumnName])

第二,从值中获取时间:

TIMEVALUE([TableColumnName])

示例:

表:客户

列:CreationDate作为DateTime

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

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

我希望这会有所帮助,因为我正在搜索一会儿,发现了许多在该问题中看到的答案,但没有一个起作用。 IE CASTCONVERT

快乐编码!

答案 42 :(得分:0)

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

答案 43 :(得分:0)

哇,让我数一数您可以做到这一点的方法。 (无双关语)

为了以特定格式获得想要的结果,

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具有这种冗余性?

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

希望这对某人有帮助。

答案 44 :(得分:0)

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

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

答案 45 :(得分:0)

SELECT CONVERT(date,getdate())

答案 46 :(得分:0)

选择convert(getdate()as daselect CONVERT(datetime,CONVERT(date,getdate()))te)

答案 47 :(得分:0)

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

SELECT SYSDATE TODAY FROM DUAL;