2011-10-07 58 views

回答

21

一個選項,避免了需要添加結束日期+ 23:59:59.999是不使用的between比較,而使用column_name >= @StartDate and column_name < @EndDate +1

+11

+1'結束日期+ 23:59:59.999'會得到反正四捨五入到第二天。它需要是'EndDate + 23:59:59.997'來避免這種情況。 –

+8

我仍然會使用'和column_name

+0

<@EndDate +1應該通過EndDate + 23:59:59.999得到與EndDate匹配的值。 – dave

2

可以改變這樣的日期時間(我使用getdate()作爲一個例子):

select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime) 

說明:

convert(char(8), getdate(), 112)的時間轉換爲yyyymmdd格式(如串)。

然後您可以只追加所需的時間,並將整個字符串再次轉換爲datetime


編輯:

當你做鑄件上數據庫列它減緩了性能,是的。
但他有一個日期時間變量,他只是使用了鑄造更改時間在變​​一次
- >我看不出有任何性能問題,如果他使用我的代碼來改變他的@EndDate變量。

但是有效點。在所有情況下鑄造都不是一個好的解決方案。

+0

在datetime和varchar之間進行投射確實會降低性能。除非需要,否則應儘量避免這種情況。也適用於其他浪涌 –

6

請注意:DATETIME類型的SQL Server中的精度和舍入2005:

datetime值四捨五入爲.000,.003,或0.007秒

SQL Server的增量2008年推出了精度爲100納秒的DATETIME2型。因此,在SQL Server 2008中,你可以這樣做:

DECLARE @d DATETIME = '2011-10-07 00:00:00.000' 
SELECT DATEADD(MS, -1, DATEADD(D, 1, CONVERT(DATETIME2, @d))) 

另外,你可能希望避免BETWEEN運算在這種情況下:

@StartDate <= Column_Name AND Column_Name < DATEADD(D, 1, @EndDate) 
3

你也可以這樣做:

select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0))) 

時@endDate是'5/3/2013'

+0

這一個更容易編輯我目前的查詢。只需要編輯我創建變量的那一行,而不是回過頭去掉每個地方的「=」。 – tarheel

4

自從datetime2數據類型問世以來,我一直在努力 這個問題。要計算一天的結束作爲datetime2數據類型,我將一天中的秒數添加到= date =然後減去100納秒。Voila:

declare @bod datetime2 

declare @eod datetime2 

set @bod = cast (GETDATE() as DATE) 

set @eod = DATEADD(ns, -100, DATEADD(s, 86400, @bod)) 

print @bod 

print @eod 

-- answer: 

2013-12-01 00:00:00.0000000 

2013-12-01 23:59:59.9999999 

現在我要關閉datetimeoffset數據類型。

+0

對不起,但是這裏假定他使用了'datetime2'類型,我認爲它不適用於SQL Server 2005(雖然可能是他自從最初發布這個問題後已經升級了)。除此之外,在SQL Server上投射[日期/時間/時間戳記類型]時會發生許多奇怪的事情(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between -and-的魔神擁有功能於common.aspx)。這也說明了對範圍普遍存在的誤解,這就是爲什麼我主張完全避免「BETWEEN」。 –

1

您可以使用between如果您的結束日期設置爲第二天的00:00:00

ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))

這次日轉換爲date,這消除了時間的信息,那麼你將其轉換回到datetime,其中添加了默認小時信息:00:00:00

-1

我第一次轉換原來的日期時間來開始新的一天,再加入小時,秒到它:

DECLARE @啓動DATETIME,@end DATETIME

SET @啓動= DATEADD(DAY,DATEDIFF( DAY,0,GETDATE()),0)

SET @end = DATEADD(HOUR,23,DATEADD(N,59,@啓動))

PRINT @啓動

PRINT @end

2017年10月27日12:00 AM

2017年10月27日下午11:59

相關問題