根据日期范围获取所有记录

时间:2019-09-19 19:14:46

标签: sql-server tsql datetime

我想根据日期范围查询下表数据。

enableSkipIncompatibleRow

我编写了此查询来过滤数据,但没有得到任何数据。

Id      | DateFrom    |  DateTo
--------+-------------+-------------
1       | 2019-09-15  |  2019-09-17
2       | 2019-09-20  |  2019-09-20
3       | 2019-09-21  |  2019-09-21
4       | 2019-09-22  |  2019-09-22
5       | 2019-09-20  |  2019-09-22

输出应为1、4、5条记录。

如果DECLARE @StartDate DateTime = '09/02/2019' -- MM/DD/YYYY DECLARE @EndDate DateTime = '09/20/2019' SELECT * FROM MyTable WHERE (@StartDate BETWEEN DateFrom AND DateTo) OR (@EndDate BETWEEN DateFrom AND DateTo) @StartDate@EndDate,则输出应为3、5。

3 个答案:

答案 0 :(得分:0)

您在这里依靠数据库会话设置。是``09/02/2019''是2月2日还是9月9日?该设置是否允许'/'作为日期部分的分隔符?最好使用明确的格式。对于所有SQL Server版本,均为'YYYYMMDD'(对于较新版本为'YYYY-MM-DD')。

然后,您的日期列是什么类型?如果实际上是日期时间,则可能有您看不到的时间部分。您可以投放日期以安全玩游戏。

DECLARE @StartDate DateTime = '2019-09-02'
DECLARE @EndDate DateTime = '2019-09-20'

SELECT * 
FROM MyTable
WHERE (@StartDate BETWEEN CAST(DateFrom AS DATE) AND CAST(DateTo AS DATE)) 
   OR (@EndDate BETWEEN CAST(DateFrom AS DATE) AND CAST(DateTo AS DATE));

答案 1 :(得分:0)

Below query serve my purpose. However, below query returns duplicates.. and handled distinct in c#.

SELECT * 
FROM MyTable
WHERE (DateFrom BETWEEN ''' + @DateFrom + ''' AND ''' + @DateTo + ''') 
  OR (DateTo BETWEEN ''' + @DateFrom + ''' AND ''' + @DateTo + ''')
  OR (''' + @DateFrom + ''' BETWEEN DateFrom AND DateTo) 
  OR (''' + @DateTo + ''' BETWEEN DateFrom AND DateTo)

答案 2 :(得分:0)

由于每台计算机上的日期格式可能不同,因此建议您使用DATEFROMPARTS(year, month, day)而不是文字字符串。

像这样使用它:

DECLARE @StartDate DateTime = DATEFROMPARTS(2019, 2, 9) ;
DECLARE @EndDate DateTime = DATEFROMPARTS(2019, 9, 20) ;