我想根据日期范围查询下表数据。
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。
答案 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) ;