SELECT GETDATE()
返回:2008-09-22 15:24:13.790
我想要仅包含日期部分而没有时间部分:2008-09-22 00:00:00.000
如何获得这个结果?
SELECT GETDATE()
返回:2008-09-22 15:24:13.790
我想要仅包含日期部分而没有时间部分:2008-09-22 00:00:00.000
如何获得这个结果?
注意:此答案返回原始的DATETIME
或DATETIME2
类型。要使用返回真正的DATE
类型的表达式(适用于SQL Server 2008及更高版本),请参见下面BenR的答案。
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
例如
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
给我
2008-09-22 00:00:00.000
优点:
datetime
数据类型不能完全没有时间。我认为您正在混淆数据存储和用户呈现。如果您只想显示给用户一个没有时间部分(不是零,只是空白)的字符串,则只需使用Convert(varchar(30), @Date, 101)
或类似的东西即可。有关更多信息,请参阅SQL Server Books Online • Cast and Convert。 - ErikECAST(... AS DATE)
或 CONVERT(DATE, ...)
来实现,这在本页面上已经提到了很多次。 - MagnusSELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
,因为这样就可以将“dd”替换为任何其他datepart
关键字,以在任意级别上截断你的datetime
。 - MichaelSQLServer 2008现在具有一个“日期”数据类型,仅包含日期而没有时间组件。任何使用SQLServer 2008及以上版本的人都可以执行以下操作:
SELECT CONVERT(date, GETDATE())
如果使用 SQL 2008 或更新版本:
select cast(getdate() as date)
DateTime2
替代即可解决,http://sqlfiddle.com/#!6/9eecb7/2833 。 - abatishchevdeclare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=> 2015-10-01
- FrédéricDATEADD和DATEDIFF比转换为varchar更好。两个查询具有相同的执行计划,但是执行计划主要涉及数据访问策略,并不总是揭示执行所有操作所需的CPU时间中涉及的隐式成本。如果这两个查询运行在一个拥有数百万行的表上,则使用DateDiff的CPU时间可能接近于Convert CPU时间的1/3!
要查看查询的执行计划:
set showplan_text on
GO
DATEDIFF和DATEADD都会执行CONVERT_IMPLICIT。
虽然对于某些人来说,使用CONVERT的解决方案更简单、更易于阅读,但它更慢。没有必要将其转换回DateTime(这是服务器隐式完成的)。在DateDiff方法中也没有真正需要在之后使用DateAdd,因为整数结果也将隐式转换回DateTime。
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]))
从 DatesTable 表中选取 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类型再转换回来并不总是会得到原始值。
记住:不要相信任何人。查看性能统计数据并自己测试!
在测试结果时要小心。将许多行选择到客户端会隐藏性能差异,因为发送行集到网络比执行计算需要更长的时间。所以请确保所有行的工作都由服务器完成,但没有行集发送到客户端。
对于一些人来说,缓存优化何时影响查询似乎有些困惑。在同一批次或不同批次中运行两个查询对缓存没有影响。因此,您可以手动使缓存过期,也可以简单地反复运行查询多次。对查询#2的任何优化也将影响任何后续查询,因此如果愿意,可以放弃执行#1。
这里是完整的测试脚本和性能结果,证明DateDiff比转换为varchar要快得多。
试试这个:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
上面的语句将您当前的格式转换为YYYY/MM/DD
,请参考此链接选择您喜欢的格式。
mm/dd/yyyy
格式。 - FleaSELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
只需执行以下操作:
SELECT CAST(date_variable AS date)
或者在 PostgreSQL 中使用:
SELECT date_variable::date
这被称为类型转换!
返回日期格式的方法:
CAST(OrderDate AS date)
上述代码适用于SQL Server 2010。
它将返回类似于12/12/2013的日期格式。
对于SQL Server 2012,请使用以下代码:
CONVERT(VARCHAR(10), OrderDate , 111)
CONVERT
函数返回日期。请参阅以下链接:
使用转换函数的语法为:CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
如果你需要结果作为 varchar
类型,你应该通过以下步骤进行
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
上面已经提到过。
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014年3月26日 00:00:00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014年3月26日 00:00:00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014年3月26日 00:00:00.000