簡體   English   中英

日期之間的SQL語句

[英]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:002012-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM