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

SELECT GETDATE()

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

我希望该日期部分没有时间部分: 2008-09-22 00:00:00.000

我该怎么办?

答案

SQL Server 2008及更高版本上,您应该CONVERT为最新版本:

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

优点:

  • 无需varchar <-> datetime转换
  • 无需考虑locale

正如迈克尔建议的

使用此变体: SELECT DATEADD(dd, DATEDIFF(dd, 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()))

输出:

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

SQLServer 2008 现在具有 “日期” 数据类型,该数据类型仅包含没有时间成分的日期。使用 SQLServer 2008 及更高版本的任何人都可以执行以下操作:

SELECT CONVERT(date, GETDATE())

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

select cast(getdate() as date)

DATEADD 和 DATEDIFF 优于转换为 varchar。这两个查询都具有相同的执行计划,但是执行计划主要是关于数据访问策略的,并不总是揭示执行所有步骤所花费的 CPU 时间所隐含的成本。如果两个查询都针对具有数百万行的表运行,则使用 DateDiff 的 CPU 时间可能接近 “转换 CPU 时间” 的 1/3!

要查看查询的执行计划:

set showplan_text on
GO

DATEADD 和 DATEDIFF 都将执行 CONVERT_IMPLICIT。

虽然 CONVERT 解决方案更简单,更容易阅读一些,其速度较慢 。无需回退到日期时间(这是由服务器隐式完成的)。之后,DateAdd 的 DateDiff 方法中也没有真正的需求,因为整数结果也将隐式转换回 datetime。


从 DatesTable 中选择转换(varchar,MyDate,101)

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

从 DatesTable 中选择 SELECT 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]))

使用 FLOOR()作为 @digi 建议的性能接近于 DateDiff,但不建议将其转换为 float 和 back 的 datetime 数据类型并不总是产生原始值。

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

测试结果时请多加注意。选择许多行给客户端将隐藏性能差异,因为通过网络发送行比执行计算花费的时间更长。因此,请确保所有行的工作均由服务器完成,但没有行集发送给客户端。

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

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

尝试这个:

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

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

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

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

SQL Server 2000 中的日期和时间处理

转换并转换

使用 convert 函数的语法为:

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

以日期格式返回

CAST(OrderDate AS 日期)

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

它将在 2013 年 12 月 12 日返回

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

CONVERT(VARCHAR(10), OrderDate , 111)

如果您需要将结果作为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

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