[英]SQL statement between date
這讓我發瘋,不知道我在這里失蹤了什么..
所以這是我的數據列看起來像:
StartDateTime:
---------------
2012-01-17 11:13:46.530
2012-01-17 11:17:22.530
2012-02-17 11:31:22.223
這是我的查詢試圖得到:
select * from tablName
where convert(varchar(10), startDateTime, 101) between '2012-01-17' and '2012-01-17'
基於以上我應該得到兩行? 但它沒有,它返回零行。 這樣做的正確方法是什么?
PS:我也看過MSDN網站:
您的查詢僅匹配2012-01-17 00:00:00
和2012-01-17 00:00:00
之間的日期。 因此,唯一的匹配是日期恰好是2012-01-17 00:00:00
。
相反,我會這樣做:
declare @dateInput as DateTime
set @dateInput = '2012-01-17'
select *
from tablName
where startDateTime >= @dateInput
and startDateTime < dateadd(day, 1, @dateInput)
注意:SQL Server 2008+具有新的數據類型Date
,沒有時間組件,可以使這些類型的查詢更具可讀性。
現在有更多的信息,所以我會添加一個更合適的答案。 這些要求現在是一個存儲過程傳遞了一個Date類型參數,而不是DateTime,並且希望根據一個名為StartDateTime的DateTime字段的條件從表中返回行...
create procedure dbo.spGetEntriesForOneDay
@DesiredDate DateTime
as
SET NOCOUNT ON;
SET @DesiredDate = DATEADD(day, DATEDIFF(day, 0, @DesiredDate), 0)
SELECT Field1, Field2 -- see note 1
FROM dbo.TableName
WHERE StartDateTime >= @DesiredDate -- see note 2
AND StartDateTime < DATEADD(day, 1, @DesiredDate) -- see note 3
注1 :不要在生產代碼中使用*,尤其是在存儲過程中。 除了通過返回列而浪費之外,您可能不需要並且排除對列的子集進行覆蓋索引的優化,只要更改基礎表以便避免不可預測的結果,就需要重新編譯此存儲過程。
注2 :避免在函數中包裝字段。 未包含在函數中的字段可能會被優化器匹配到索引,而函數中包含的字段永遠不會。
注3 :@Martin Smith和@RedFilter是正確的.997精度假定DateTime數據類型永遠; 這種方法更具有未來性,因為它不假設數據類型精度。
你正在使用日期時間字段(我猜)。 別忘了時間:
select * from tablName
where startDateTime between '2012-01-17' and '2012-01-17 23:59:59.997'
您可以在where子句中使用DateDiff函數。 它看起來像這樣:
select col1, col2 from tablName where DateDiff(day, startDateTime, @DesiredDate) = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.