因此,我在SQL Server中有一個表,其上有一個datetime
列。我想從該表中選擇所有:從表中選擇
select * from dbo.tblMessages
,但我想在一個datetime
參數來傳遞。然後我想從表中選擇那些在tblMessages
相同day
爲datetime
列中的所有郵件,而不僅僅是那些張貼在過去24小時內,等
我將如何做到這一點?
謝謝。
因此,我在SQL Server中有一個表,其上有一個datetime
列。我想從該表中選擇所有:從表中選擇
select * from dbo.tblMessages
,但我想在一個datetime
參數來傳遞。然後我想從表中選擇那些在tblMessages
相同day
爲datetime
列中的所有郵件,而不僅僅是那些張貼在過去24小時內,等
我將如何做到這一點?
謝謝。
這應該如果你需要做這tblMessages
select * from dbo.tblMessages
WHERE
MyDateTimeCol >= DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 0)
AND
MyDateTimeCol < DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 1)
應用於MyDateTimeCol將阻止任何索引功能正確使用上MyDateTimeCol使用索引,這INCLUDIN和@Mydatetime
'0'如何在您的DATEDIFF功能中工作?我認爲那必須是開始日期? – 2011-04-17 20:04:38
@Abe Miessler:我從日期時間中刪除時間。 0 = 1900年1月1日在這種情況下。請參閱http:// stackoverflow。在SQL Server 2008中[鑄造到日期是sargable](http://connect.microsoft.com/)在SQL Server 2008中[sql-server-to-date-date-date-datetime] – gbn 2011-04-17 20:06:12
SQLServer的/反饋/信息/ 526431 /化妝更功能,可優化搜索)。 – 2011-04-17 20:32:52
之間DATEDIFF了很多,如果你的SQL Server 2005或更高版本上,你也可以這樣做:
添加三個計算列的一天,男onth,你的約會的一年,堅持那些
ALTER TABLE dbo.YourTable
ADD DayPortion AS DAY(YourDateTimeColumn) PERSISTED
-- do the same for MONTH(YourDateTimeColumn) and YEAR(YourDateTimeColumn)
提上了三列的索引:
CREATE NONCLUSTERED INDEX IX_DatePortions
ON dbo.tblMessages(YearPortion, MonthPortion, DayPortion)
現在,你可以非常方便快捷地搜索這些天,月,年,通過與索引,搜索將是非常高性能和快速
SELECT (list of columns)
FROM dbo.tblMessages
WHERE YearPortion = 2011 AND MonthPortion = 4 AND DayPortion = 17
有了這個設置 - 三個計算持續的列 - 您現在可以簡單地將新行插入表中 - 這三列將自動計算。
由於它們被持久化並編入索引,因此您也可以輕鬆而高效地在這些列上進行搜索。
有了這種靈活性,你也可以很容易地找到例如給定月份或年份的所有行非常好。
如您SQL Server 2008上你可以做
SELECT *
FROM tblMessages
WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE)
這是優化搜索。 SQL Server將在調用內部函數GetRangeThroughConvert
的計劃中添加一個ComputeScalar
並獲取範圍的開始和結束。
你確定這是一個'timestamp'列而不是'Date'或'DateTime'列嗎? 'timestamp'列不包含時間信息。 http://msdn.microsoft.com/en-us/library/aa260631(v=sql.80).aspx – Oded 2011-04-17 19:52:18
對不起,它是一個日期時間列。這是一個錯字 – Scott 2011-04-17 19:53:02
你在什麼版本的SQL Server? – 2011-04-17 20:34:42