2011-04-17 40 views
4

因此,我在SQL Server中有一個表,其上有一個datetime列。我想從該表中選擇所有:從表中選擇

select * from dbo.tblMessages 

,但我想在一個datetime參數來傳遞。然後我想從表中選擇那些在tblMessages相同daydatetime列中的所有郵件,而不僅僅是那些張貼在過去24小時內,等

我將如何做到這一點?

謝謝。

+1

你確定這是一個'timestamp'列而不是'Date'或'DateTime'列嗎? 'timestamp'列不包含時間信息。 http://msdn.microsoft.com/en-us/library/aa260631(v=sql.80).aspx – Oded 2011-04-17 19:52:18

+0

對不起,它是一個日期時間列。這是一個錯字 – Scott 2011-04-17 19:53:02

+0

你在什麼版本的SQL Server? – 2011-04-17 20:34:42

回答

4

這應該如果你需要做這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

'0'如何在您的DATEDIFF功能中工作?我認爲那必須是開始日期? – 2011-04-17 20:04:38

+0

@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

+1

SQLServer的/反饋/信息/ 526431 /化妝更功能,可優化搜索)。 – 2011-04-17 20:32:52

0

之間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 
    

有了這個設置 - 三個計算持續的列 - 您現在可以簡單地將新行插入表中 - 這三列將自動計算。

由於它們被持久化並編入索引,因此您也可以輕鬆而高效地在這些列上進行搜索。

有了這種靈活性,你也可以很容易地找到例如給定月份或年份的所有行非常好。

1

如您SQL Server 2008上你可以做

SELECT * 
FROM tblMessages 
WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE) 

這是優化搜索。 SQL Server將在調用內部函數GetRangeThroughConvert的計劃中添加一個ComputeScalar並獲取範圍的開始和結束。