如何在SQL中选择没有时间的日期


257

当我在SQL中选择日期时,它将返回为 2011-02-25 21:17:33.933。但是我只需要Date部分,即2011-02-25。我怎样才能做到这一点?


4
我猜他想要一个字符串,因此不能重复
bernd_k 2011年


@TylerH有什么办法可以代替当前时间获取2011-02-25 00:00:00.000?
Thrainder

Answers:


148

我想他想要一根绳子。

select convert(varchar(10), '2011-02-25 21:17:33.933', 120)

120告诉转换函数我们以以下格式传递输入日期:yyyy-mm-dd hh:mi:ss


120有什么用?
57Павле

@Павле参考这篇文章的日期和时间样式
福克斯荣担

我使用了这个select convert(varchar(10),APPROVED_DATE,120),我得到了错误列APPROVED_DATE datetime,我将如何转换它?错误无法绑定多部分标识符“ LAB_RESULTS.APPROVED_DATE”。
阿卜杜拉

530

对于SQL Server 2008:

Convert(date, getdate())  

请参考https://docs.microsoft.com/zh-cn/sql/t-sql/functions/getdate-transact-sql


6
我得到“类型日期不是已定义的系统类型”。
2012年

10

33
我不知道为什么这是一个如此高的答案。这个问题是针对SQL Server 2005的,而不是 SQL Server 2005的。2005没有date数据类型,因此使此解决方案无效。
约书亚伯恩斯

84
它之所以被接受是因为人们开始寻找解决问题的方法,而不是作者。因此,如果110个人认为这对他们有用,那么我认为110票赞成是公平的。
詹姆斯

我在使用select convert(table.order_date,getdate());时遇到相同的错误;sql server 2017,错误(类型日期不是定义的系统类型)列类型日期时间
阿卜杜拉

57

最快的是datediff,例如

select dateadd(d, datediff(d,0, [datecolumn]), 0), other..
from tbl

但是,如果只需要使用该值,则可以跳过dateadd,例如

select ...
WHERE somedate <= datediff(d, 0, getdate())

该表达式datediff(d, 0, getdate())足以返回没有时间部分的今天的日期。


老家伙,老兄,在较旧的2000/2005数据库中使用了数十次此技巧。
KeithS

43

使用对我有用的CAST(GETDATE()作为日期),简单。


我将在哪里添加列名?选择演员表(getdate()作为date,order_date)?
阿卜杜拉

@阿卜杜拉CAST(order_date AS DATE)
安德鲁·莫顿



10

对于2008较旧的版本

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


为此鼓掌!其他解决方案仅依赖varchar(10)部分,该部分仅截断了值。
贡萨·奥维耶多

2

有点晚了,但是使用ODBC“ curdate”函数(尖括号'fn'是ODBC函数转义序列)。

SELECT {fn curdate()} 

输出: 2013-02-01


4
老实说,我很好奇您认为自己的答案比公认的答案更好。或者您可能在哪里提到其他答案?
Mikael Eriksson

1
@Mikael Eriksson:嗯,因为ODBC函数是规范函数,因此是可索引的,这与不确定的SQL Server函数不同。但没关系,当您从测试中的3个条目转移到生产中的1个* 10E6条目时,这只是一个扩展问题,开发过程中您不会遇到任何问题;)
Stefan Steiger 2013年

8
如果运行此查询SELECT {fn curdate()} FROM (SELECT 1) AS T(X)并查看实际的执行计划(xml版本),您将看到实际执行的是CONVERT(varchar(10),getdate(),23)。因此,此ODBC函数的数据类型是varchar(10)意味着,如果要与a比较结果,datetime则将在字符串上获得从varchar(10)到的隐式转换。该隐式转换将失败。datetimeyyyy-mm-ddset dateformat dmy
Mikael Eriksson

1
@Mikael Eriksson:看起来像个错误,他们应该改用SELECT CONVERT(char(8),GETDATE(),112)。
Stefan Steiger 2014年

“与非确定性SQL-Server函数不同,规范函数因此可索引” –呃,什么?
马丁·史密斯


2

转换为日期后将其转换回日期时间,以便在需要时保持相同的数据时间

select Convert(datetime, Convert(date, getdate())  )


1

使用很简单:

convert(date, Btch_Time)

下面的例子:

表:

Efft_d       Loan_I  Loan_Purp_Type_C   Orig_LTV    Curr_LTV    Schd_LTV    Un_drwn_Bal_a      Btch_Time            Strm_I  Btch_Ins_I
2014-05-31  200312500   HL03             NULL         1.0000    1.0000         1.0000      2014-06-17 11:10:57.330  1005    24851e0a-53983699-14b4-69109


Select * from helios.dbo.CBA_SRD_Loan where Loan_I in ('200312500') and convert(date, Btch_Time) = '2014-06-17'

1

为时已晚,但后续工作对我来说很好

declare @vCurrentDate date=getutcdate()

select @vCurrentDate

当数据类型为日期时,小时数将被截断


0

在PLSQL中,您可以使用

to_char(SYSDATE,'dd/mm/yyyy')

考虑将其转移到评论中。
xlembouras 2014年

这个问题是有关SQL Server ...不是甲骨文

0

首先将日期转换为浮点数(显示数字),然后ROUND将数字转换为0小数点,然后将其转换为datetime。

convert(datetime,round(convert(float,orderdate,101),0) ,101)

0

如果要返回日期类型作为日期,请使用

CONVERT(date, SYSDATETIME())

要么

SELECT CONVERT(date,SYSDATETIME()) 

要么

DECLARE @DateOnly Datetime
SET @DateOnly=CONVERT(date,SYSDATETIME())

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.