SELECT GETDATE()

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

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

我怎么能得到那个?


当前回答

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

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

铸造和转换

使用convert函数的语法为:

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

其他回答

如果您使用的是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日

如果您需要更多格式,可以转到:

标准日期和时间格式字符串自定义日期和时间格式字符串

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 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转换无需考虑区域设置

如果您希望使用CONVERT并获得与所提出的原始问题相同的输出,即yyyy-mm-dd,则使用与前两个答案相同的CONVERT(varchar(10),[SourceDate as dateTime],121)代码,但用虚线转换为yyyy-mm-dd的代码为121。

如果我能马上发表意见,这种格式不属于数据层,这就是为什么在SQL Server 2008引入实际日期部分数据类型之前,如果没有愚蠢的高开销“技巧”是不可能的。在数据层中进行这样的转换是对DBMS开销的巨大浪费,但更重要的是,在执行类似操作的第二秒,基本上已经在内存中创建了孤立数据,我假设您将返回到程序。您不能将其放回另一个3NF+列中,或将其与任何类型的数据进行比较而不进行还原,因此您所做的只是引入了失败点并删除了关系引用。

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

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

然后你可以用

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

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