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

如何仅从SQL Server日期时间数据类型返回日期,sql,sql-server,tsql,date,datetime,Sql,Sql Server,Tsql,Date,Datetime,返回:2008-09-22 15:24:13.790 我想要没有时间的日期部分:2008-09-22 00:00:00.000 我怎样才能得到它?试试这个: SELECT GETDATE() 上述语句将您的当前格式转换为YYYY/MM/DD,请参阅以选择您的首选格式。在SQL Server 2008及更高版本上,您应转换为日期: SELECT CONVERT(VARCHAR(10),GETDATE(),111) 在旧版本上,可以执行以下操作: SELECT CONVERT(date, get

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

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

我怎样才能得到它?

试试这个:

SELECT GETDATE()
上述语句将您的当前格式转换为YYYY/MM/DD,请参阅以选择您的首选格式。

在SQL Server 2008及更高版本上,您应转换为日期:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)
在旧版本上,可以执行以下操作:

SELECT CONVERT(date, getdate())
  |--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]))
比如说

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
给我

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
优点:

不需要varchardatetime转换 不需要考虑语言环境 按照

使用此变量:选择DATEADDdd、DATEDIFFdd、0、getdate、0

输出:

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()))
您可以使用CONVERT函数仅返回日期。请参阅以下链接:

使用convert函数的语法为:

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

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

使用FLOOR-just cut time部分

SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

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

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DATEADD和DATEDIFF都将执行CONVERT_隐式

虽然CONVERT解决方案对于某些人来说更简单、更容易阅读,但速度较慢。不需要回溯到datetime,这是由服务器隐式完成的。DateDiff方法中也不需要DateAdd,因为整数结果也将隐式转换回datetime

从DatesTable中选择CONVERTvarchar、MyDate和101

从DatesTable中选择DATEADDdd、0、DATEDIFFdd、0、MyDate

使用@digi建议的FLOOR性能更接近DateDiff,但不推荐使用,因为将datetime数据类型强制转换为float和back并不总是产生原始值

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

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

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


这里是证明DateDiff比转换为varchar快得多。

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

SELECT CONVERT(date, getdate())
  |--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]))

如果使用SQL 2008及以上版本:

SELECT CONVERT(date, GETDATE())

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

如果我能在我的soapbox上呆一会儿,这种格式不属于数据层,这就是为什么在SQL Server 2008引入实际的datepart数据类型之前,如果没有愚蠢的高开销“技巧”是不可能的。在数据层中进行这样的转换是对DBMS开销的巨大浪费,但更重要的是,当您执行类似操作时,基本上已经在内存中创建了孤立数据,我认为您将返回到程序。您不能将它放回另一个3NF+列,也不能在不恢复的情况下将其与键入的任何内容进行比较,因此您所做的只是引入故障点并删除关系引用


您应该始终将dateTime数据类型返回给调用程序,并在表示层中进行必要的调整。只要在将内容返回给调用方之前进行转换,就可以消除应用程序对引用完整性的所有希望。这将再次阻止更新或删除操作,除非您执行某种手动恢复,这将在不需要时再次使您的数据暴露于人为/代码/小精灵错误。

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

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

我认为这很有用。

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

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
以日期格式返回

CASTOrderDate作为日期

上述代码将在SQLServer2010中工作

它将在2013年12月12日左右回归

对于SQL Server 请使用下面的代码


如果您需要将结果作为varchar,那么应该通过

CONVERT(VARCHAR(10), OrderDate , 111)
上面已经提到了

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

2014-03-26 00:00:00.000

2014-03-26 00:00:00.000

2014-03-26 00:00:00.000


为什么不使用DATE格式的datetiem列“%d-%m-%Y”

例如:从表名称中选择日期格式化某些日期时间列“%d-%m-%Y”


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

即使使用古老的MSSQL Server 7.0,这里的代码也允许我获得当时正在寻找的任何日期格式:

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
它产生了以下输出:

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

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

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

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

如果微软也能支持ANSI标准的CURRENT_DATE变量,那就太好了。

好的,尽管我有点晚了:,这里是另一个解决方案

SELECT CAST(CURRENT_TIMESTAMP AS DATE)
结果

如果您使用的是SQL Server 2012及更高版本,则可以使用如下格式函数-

2008-09-22 00:00:00.000

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

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
日期:

时间:

关于sqlserver2000

SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
从SQL SERVER 2012开始,您可以执行以下操作:

如果您使用的是SQL Server 2012或更高版本,请选择FORMATGETDATE,“yyyy-MM-dd 00:00:00.000”

, 使用函数

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

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
区域性选项非常有用,因为您可以根据查看者指定日期

你必须记住d代表小图案,d代表长图案

1.d-短日期模式。 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日
产出如下:

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'
在本例中,仅限日期,您将运行以下查询:

选择CONVERTVARCHAR10,getdate,111

只要做:

选择CASTdate\u变量作为日期

或使用PostgreSQL:


选择date_variable::date

如果您希望获得一个没有时间的日期数据类型,即使时间是00:00:00,也说明您运气不好,您可以得到一个varchar,但它的结构是datetime,您将始终有一些时间。需要注意的是,SQL Server 2008包含一个单独的日期数据类型,用于只存储日期而不存储时间组件。这里的更多信息:不要错过展示各种时间删除方法的性能测试结果。不要被投票和被接受的答案误导,看看@Rohit吧,你错误地认为2008是人们关心的唯一版本。在野外有更多的版本。投票本身就说明了问题。对于meSELECT CONVERTVARCHAR10,GETDATE,101,返回的是'2008/09/22'是mm/dd/yyyy格式。如果您是基于数据库之外的原始文本值进行排序,那么'japanese'格式更好这些方法都很好,但是你建议使用哪一个呢?请注意,前两个的正确版本是select DATEADDD、datediffdd、0、getdate、0,因为dds可以替换为任何一个,以在你选择的任何段剪辑日期。还要注意的是,dd只是day的缩写。+1看起来比常用的双转换方法快35%,我也使用了多年。不错。我能看到你的解决方案唯一的缺点是,除非你知道它在做什么,否则它有点迟钝。使用双转换方法可以让无用的代码维护人员更清楚地了解您的意图。顺便说一句,我没有否决你。我想我也会开始使用你的方法。谢谢@aku@pilavdzice将datetime设置为当天午夜确实会减少时间。你期待什么结果?datetime数据类型不能完全没有时间。我认为你把数据存储和用户演示混淆了。如果您想要的只是向用户显示一个没有时间部分的字符串(不是零,只是空格),那么您只需要Convertvarchar30、@Date、101或类似的东西。有关详细信息,请参阅。@user1671639 datetime数据类型始终同时包含日期和时间,如果没有另一个数据类型,则无法合理地存储其中一个数据类型-除非您使用的是SQL Server 2008,在这种情况下,还有单独的“日期”和“时间”数据类型。如果您使用CONVERT like

那就是,你真的想要一个字符串供以后使用,所以你会被困在这样做-虽然它会更好,如果你使用日期格式化功能,而不是切断日期-或通过铸造。。。作为DATE或CONVERTDATE,…,这在本页上经常提到。我建议更改答案,选择DATEADDdd,DATEDIFFdd,0,@your_DATE,0,因为这样dd可以替换为任何其他关键字,以在任意级别截断日期时间。Ricardo C,很好的调查!您使用什么版本的SQL server?在MSSQLS2000上,使用datediff的方法对我来说执行速度稍快。请注意,我执行了1000.000次测试。对于真实场景,性能差异不会很明显,我猜Aku,我在本测试中使用了SQLServer2005Express。我在2000工作,我将用一个超过2400万行的表来测试它,看看结果如何。Aku,同样的结果。1000万行以上的性能没有差别。关于性能相同的说法是不正确的。当然,执行计划将是相同的!!!衡量这些方面的性能必须通过比较CPU使用情况来完成,而不是检查执行计划。这种方法不是最快的,而且还隐含地告诉人们,将日期转换为浮动是准确的,而事实并非如此。请参阅以了解更多详细信息。SQL2008中还有“时间”数据类型,它回答了分离日期和时间的另一半问题。仅供参考,我对从日期中减去时间的不同方法进行了基准测试,这是最快的方法。尽管差异很小,但显然比大量执行更快。wt关于SQLServer2005???@Dr.MAF完成这个循环,2008年之前的答案如下:@FredrickGauss:什么类型,日期?您使用的是什么版本的SQL Server?小心!声明@date1 datetime='2015-09-30 20:59:59.999';选择cast@date1date返回'2015-10-01'@Nick:这是DateTime的问题。改用DateTime2,效果很好@Nick,为了补充abatishchev的回复,由于日期时间限制,您的@date1确实是2015-10-01。到目前为止,尝试不使用任何石膏,它也会产生2015-10-01!声明@date1 datetime='2015-09-30 23:59:59.999';选择@date1=>2015-10-01这些简单易记的SQL技巧之一。正如Mike所说,仅2008年以后,但是如果您在某处找到2005年和以前的数据库,您可能会遇到很多问题:例如,如果您希望查询将与用户提供的日期匹配的所有记录作为某个时间字段的日期部分,则除外。祝您好运,只在表示层中这样做。你不需要转换,你可以使用日期算术,但你明白了…@Andrew为什么这很重要?你说其中col>=@Date和colSELECT CAST(CURRENT_TIMESTAMP AS DATE)
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
2008-09-22 00:00:00.000
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date) SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
FORMAT ( value, format [, culture ] )
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)
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日
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