在SQL Server中最有效的方式来获得日期+时间日期?(Most efficient way i

2019-06-21 01:56发布

在MS SQL 2000年和2005年,给定一个日期时间,如“2008-09-25 12:34:56”什么是最有效的方式来获得仅包含“2008-09-25”日期时间?

重复这里 。

Answer 1:

我必须承认,我从来没有见过马特所示的立式浮充转换。 我测试了这一点。

我测试了一个纯粹的选择(这将返回日期和时间,是不是我们想要的),这里的卫冕溶液(地板浮动),一个共同的“天真”一个在这里(stringconvert)提到的,在这里提到,我是第一个使用(因为我认为这是最快的)。

我测试查询测试服务器的MS SQL Server 2005上的最大内存运行的3GHz的至强CPU一个双赢2003 SP2 Server上运行(32位,所以这是约3.5 GB)。 这是晚上在那里我使机器沿几乎无负载怠速。 我这一切得到了自己。

下面是从我的试运行,从包含时间戳的变化精确到毫秒级的大型表中选择日志。 这种特殊的数据集包括日期范围超过25年。 该表本身具有超过130万行,所以这就是为什么我限制顶端万美元。

SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2

SQL Server分析和编译时间:CPU时间= 0毫秒,经过的时间= 1毫秒。

(百万行(一个或多个)受影响)表 'tblMeasureLogv2'。 扫描计数1,逻辑读取4752,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0。

SQL Server的执行时间:CPU时间= 422毫秒,经过的时间= 33803毫秒。

(百万行(一个或多个)受影响)表 'tblMeasureLogv2'。 扫描计数1,逻辑读取4752,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0。

SQL Server的执行时间:CPU时间= 625毫秒,经过的时间= 33545毫秒。

(百万行(一个或多个)受影响)表 'tblMeasureLogv2'。 扫描计数1,逻辑读取4752,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0。

SQL Server的执行时间:CPU时间= 1953年毫秒,经过的时间= 33843毫秒。

(百万行(一个或多个)受影响)表 'tblMeasureLogv2'。 扫描计数1,逻辑读取4752,物理读取0,预读0,lob逻辑读取0,lob物理读取0次,lob预读0。

SQL Server的执行时间:CPU时间= 531毫秒,经过的时间= 33440毫秒。 SQL Server分析和编译时间:CPU时间= 0毫秒,经过的时间= 1毫秒。

SQL Server的执行时间:CPU时间= 0毫秒,经过的时间= 1毫秒。

什么是我们这里看到的?

让我们专注于CPU时间(我们正在考虑转换),我们可以看到,我们有以下数字:

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

从这一点看来,我喜欢使用DateAdd(至少在这种特殊情况下)略比地板 - 浇铸法更快。

你去那里之前,我跑这个测试几次,改变,同杂交的结果查询的顺序。

这是一件奇怪的我的服务器,或者是什么呢?



Answer 2:

Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)

DateDiff的(日,0,GETDATE())是相同的则DateDiff(日, '1900-01-01',GETDATE())

既然则DateDiff返回一个整数,你将得到的是已经过去的天数自1月1日,1900年然后,您的天是整数添加到1月1日,1900年的净效果是消除时间组件。

我还要提到的是这种方法适用于任何日期/时间的部分(如年,季,月,日,时,分,秒)。

Select  DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select  DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select  DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select  DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select  DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select  DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')

最后一个,为秒,需要特殊处理。 如果使用1900年1月1日,你会得到一个错误。

两个日期时间列的差异在运行时造成的溢出。

您可以通过使用不同的参考日期(如2000年1月1日)避开这个错误。



Answer 3:

select cast(floor(cast(@datetime as float)) as datetime)

因为作品铸造日期时间浮动给人的天数(包括每天的分数)自1月1日,1900年地板它消除了小数天,叶全天,然后可以转换回日期时间数量。



Answer 4:

在SQL Server 2012中使用

select cast(getdate() as date)


Answer 5:

select cast(getdate()as varchar(11))as datetime


Answer 6:

要获得YYYY-MM-DD,使用方法:

select convert(varchar(10), getdate(), 120)

编辑:哎呀,他想要一个DateTime,而不是一个字符串。 TRUNC的Oracle中的等效()。 你可以采取什么我张贴,并转换回一个DateTime:

select convert(datetime, convert(varchar(10), getdate(), 120) , 120)


Answer 7:

CONVERT,地板和DATEDIFF将执行一样的。

如何只从SQL Server datetime数据类型返回日期部分



Answer 8:

在下面的链接描述的三种方法。 我还没有表现对它们进行测试,以确定这是最快的。

http://www.blackwasp.co.uk/SQLDateFromDateTime.aspx



Answer 9:

CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME)表现最好由远。 当你可以看到证明及测试在SQL Server中得到的日期没有时间



Answer 10:

怎么样SELECT CAST(CASt(GETDATE() AS int) AS DATETIME)



Answer 11:

CONVERT(VARCHAR(10), GETDATE(), 120) AS [YYYY-MM-DD]


文章来源: Most efficient way in SQL Server to get date from date+time?