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) ;