2016
SELECT GETDATE()

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

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

我怎么能得到那个?

4

44 回答 44

2727
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 转换
  • 无需考虑语言环境
于 2008-09-22T03:34:16.873 回答
796

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

SELECT CONVERT(date, GETDATE())
于 2008-09-24T13:02:21.577 回答
197

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

select cast(getdate() as date)
于 2011-01-31T09:44:38.633 回答
83

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

要查看查询的执行计划:

set showplan_text on
GO 

DATEADD 和 DATEDIFF 都将执行 CONVERT_IMPLICIT。

尽管 CONVERT 解决方案对某些人来说更简单、更易于阅读,但速度较慢。无需转换回 DateTime(这是由服务器隐式完成的)。之后在 DateDiff 方法中也不需要 DateAdd,因为整数结果也将隐式转换回 DateTime。


从日期表中选择转换(varchar,MyDate,101)

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[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 数据类型转换为 float 和 back 并不总是产生原始值。

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

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

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

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

于 2008-09-22T08:04:09.923 回答
59

试试这个:

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

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

于 2008-09-22T03:33:29.137 回答
45
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
于 2008-09-22T03:33:53.253 回答
27

以日期格式返回

CAST(OrderDate AS 日期)

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

它将在 2013 年 12 月 12 日返回

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

CONVERT(VARCHAR(10), OrderDate , 111)
于 2013-12-19T06:48:07.263 回答
23

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

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

铸造和转换

使用转换函数的语法是:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
于 2008-09-22T03:34:43.393 回答
20

如果你需要结果作为 a 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

于 2014-03-26T12:39:38.697 回答
20

如果您使用的是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. 自定义日期和时间格式字符串
于 2016-08-24T07:36:10.647 回答
17
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
于 2011-09-22T12:21:32.920 回答
16

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
于 2008-09-22T07:38:59.953 回答
14

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

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

您应该始终将您的 dateTime 数据类型返回给调用程序,并在 PRESENTATION 层中进行必要的调整。一旦你在将它们返回给调用者之前进行转换,你就消除了应用程序中引用完整性的所有希望。这将再次阻止 UPDATE 或 DELETE 操作,除非您进行某种手动还原,否则在不需要时再次将您的数据暴露给人/代码/gremlin 错误。

于 2012-07-26T20:00:30.210 回答
13

做就是了:

SELECT CAST(date_variable AS date)

或与 PostgreSQL 一起使用:

SELECT date_variable::date

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

于 2020-01-15T10:08:00.797 回答
12
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 方法。

于 2008-09-22T03:35:23.250 回答
12

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

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

我希望它很有用。

于 2013-11-17T17:36:27.173 回答
9
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
于 2014-05-12T14:41:48.300 回答
9

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
于 2016-05-13T21:00:11.317 回答
8

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

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

于 2019-11-24T08:00:22.063 回答
7

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
于 2013-11-27T06:16:38.803 回答
7
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
于 2014-11-19T20:46:35.800 回答
7

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

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')
于 2016-04-13T10:46:30.673 回答
7

日期:

选择转换(日期,GETDATE())
选择 CAST(GETDATE() 作为日期)

时间:

选择转换(时间,GETDATE(),114)
选择 CAST(GETDATE() 作为时间)
于 2016-05-21T09:24:33.713 回答
7

只需您可以这样做:

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
于 2017-09-08T05:24:19.953 回答
6

即使使用古老的 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
于 2015-02-27T21:16:05.370 回答
5

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

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

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

于 2014-05-17T05:46:19.993 回答
5

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

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

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

于 2015-04-30T19:00:38.083 回答
5

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

于 2016-01-15T18:14:06.703 回答
5

在 SQL Server 2000 上

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
于 2016-05-24T09:36:18.633 回答
5

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

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

于 2016-07-20T15:58:29.473 回答
4

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

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

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

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

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

于 2014-03-29T15:22:57.063 回答
4

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

于 2015-07-08T06:28:44.247 回答
4
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
于 2015-09-01T13:02:45.503 回答
4

句法:

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]
于 2021-03-09T12:28:21.040 回答
3

我在没有时间部分的情况下获取日期的常用方法..

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

 SELECT CAST(GETDATE() AS DATE)
于 2017-10-21T04:02:23.830 回答
3

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

然后你可以使用

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

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

于 2019-07-30T10:32:57.103 回答
2

我的风格

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
于 2018-11-21T11:39:50.820 回答
2
select cast(createddate as date) as derivedate from table 

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

于 2019-03-24T17:36:20.663 回答
1

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

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

于 2019-03-30T11:01:20.850 回答
1

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

为了以这种格式获得您想要的结果:

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

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

希望这可以帮助某人。

于 2019-04-23T17:56:52.940 回答
0

由于自从这个问题得到答案以来发生了很多变化,我想提供一种新的方法来获得所请求的结果。有两种方法可以解析 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

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

快乐编码!

于 2020-02-07T16:52:48.737 回答
-1

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

SELECT SYSDATE TODAY FROM DUAL; 
于 2016-03-29T22:56:51.553 回答
-1
select convert(getdate() as date)

select CONVERT(datetime,CONVERT(date, getdate()))
于 2018-10-05T08:18:37.693 回答
-2

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

于 2019-05-28T08:34:47.540 回答