之間的以下:ADD時間23:59:59.999,結束日期爲我已經具有使用問題
Column_Name BETWEEN @StartDate AND @EndDate.
這是因爲@EndDate = 00:00:00.000的時刻,這沒有拿起當天的所有價值。
如何將@EndDate(始終爲00:00:00.000)轉換爲日期+ 23:59:59.999?
之間的以下:ADD時間23:59:59.999,結束日期爲我已經具有使用問題
Column_Name BETWEEN @StartDate AND @EndDate.
這是因爲@EndDate = 00:00:00.000的時刻,這沒有拿起當天的所有價值。
如何將@EndDate(始終爲00:00:00.000)轉換爲日期+ 23:59:59.999?
一個選項,避免了需要添加結束日期+ 23:59:59.999是不使用的between
比較,而使用column_name >= @StartDate and column_name < @EndDate +1
可以改變這樣的日期時間(我使用getdate()
作爲一個例子):
select cast(convert(char(8), getdate(), 112) + ' 23:59:59.99' as datetime)
說明:
convert(char(8), getdate(), 112)
的時間轉換爲yyyymmdd
格式(如串)。
然後您可以只追加所需的時間,並將整個字符串再次轉換爲datetime
。
編輯:
當你做鑄件上數據庫列它減緩了性能,是的。
但他有一個日期時間變量,他只是使用了鑄造更改時間在變一次
- >我看不出有任何性能問題,如果他使用我的代碼來改變他的@EndDate
變量。
但是有效點。在所有情況下鑄造都不是一個好的解決方案。
在datetime和varchar之間進行投射確實會降低性能。除非需要,否則應儘量避免這種情況。也適用於其他浪涌 –
請注意: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)
你也可以這樣做:
select @endDate = dateadd(ms,-3,dateadd(day,1,DATEADD(dd, DATEDIFF(dd,0,@endDate), 0)))
時@endDate是'5/3/2013'
這一個更容易編輯我目前的查詢。只需要編輯我創建變量的那一行,而不是回過頭去掉每個地方的「=」。 – tarheel
自從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
數據類型。
對不起,但是這裏假定他使用了'datetime2'類型,我認爲它不適用於SQL Server 2005(雖然可能是他自從最初發布這個問題後已經升級了)。除此之外,在SQL Server上投射[日期/時間/時間戳記類型]時會發生許多奇怪的事情(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between -and-的魔神擁有功能於common.aspx)。這也說明了對範圍普遍存在的誤解,這就是爲什麼我主張完全避免「BETWEEN」。 –
您可以使用between
如果您的結束日期設置爲第二天的00:00:00
:
ColumnName between @StartDate and convert(datetime, convert(date, @EndDate + 1))
這次日轉換爲date
,這消除了時間的信息,那麼你將其轉換回到datetime
,其中添加了默認小時信息:00:00:00
。
我第一次轉換原來的日期時間來開始新的一天,再加入小時,秒到它:
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
+1'結束日期+ 23:59:59.999'會得到反正四捨五入到第二天。它需要是'EndDate + 23:59:59.997'來避免這種情況。 –
我仍然會使用'和column_name
<@EndDate +1應該通過EndDate + 23:59:59.999得到與EndDate匹配的值。 – dave