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

Sql server 根据日期范围获取所有记录,sql-server,tsql,datetime,Sql Server,Tsql,Datetime,我想根据日期范围查询下表数据 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

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

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
我写这个查询是为了过滤数据,但我没有得到任何数据

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)
输出应为1、4、5条记录


如果
@StartDate
@EndDate
'09/21/2019'
,那么输出应该是3,5。

您依赖于此处的数据库会话设置。2019年2月9日是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));

由于每台机器上的日期格式可能不同,我建议您使用
DATEFROMPARTS(年、月、日)
而不是文字字符串

像这样使用它:

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

您的代码工作正常:dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=3f3944a27d07e00208310e0e7cfa53a3,工作正常!
DECLARE @StartDate DateTime = DATEFROMPARTS(2019, 2, 9) ;
DECLARE @EndDate DateTime = DATEFROMPARTS(2019, 9, 20) ;