通过 where 子句中的不同日期过滤
Filter via different dates in where clause
我在这里使用 MS SQL
创建了一个简单的 table
CREATE TABLE Students1 (
FirstName Nvarchar(100),
SecondName Nvarchar(100),
DOB Smalldatetime,
RegisterDate smalldatetime,
Archived int,
ArchivedDate Smalldatetime
);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('James','Bike',16/04/1900, 04/07/2017,0,Null);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Adam','Bike',16/04/1901,04/07/2017,0,Null);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Chris','Bike',16/04/1902,04/09/2017,1,getdate());
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Sam','Bike',16/04/1999,04/09/2017,1,getdate());
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Josh','Bike',16/04/1999,04/09/2017,1,getdate());
我想针对此做一个简单的 select 声明,我根据我的局部变量的设置方式过滤 RegisterDate
或 ArchivedDate
。
例如,我将设置以下局部变量;
@FitlerRegisterDate
@FilterArchived
如果 @FilterREgisterDate
设置为 1,则 where 子句将查看 RegisterDate
列,但如果 @FilterArchived
设置为 1,则 where 子句将查看 ArchivedColumn
如果它们都设置为 1 那么它应该默认查看 RegisterDate
我已经看了一段时间了,看不出有什么突出的地方。如果有人能给我指出正确的方向,那就太好了。
谢谢。
您可以使用 AND
和 OR
子句根据您的变量值进行过滤:
SELECT *
FROM dbo.Students1
WHERE ( @FilterArchived = 1
AND @FilterREgisterDate = 1
AND RegisterDate = @dateToFilter )
OR ( ( @FilterREgisterDate = 1
AND RegisterDate = @dateToFilter )
OR ( @FilterArchived = 1
AND ArchivedDate = @dateToFilter ) )
像这样:
SELECT *
FROM Students1
WHERE @FilterREgisterDate = 1 AND RegisterDate = @RegisterDate
OR @FilterREgisterDate <> 1 AND @FilterArchived = 1 AND ArchivedDate = @ArchivedDate
;
?
select * from dbo.Students1 where (@FilterArchived=1 AND @FilterREgisterDate=1) and registerdate='04/07/2017'
UNION
select * from dbo.Students1 where (@FilterArchived!=1 AND @FilterREgisterDate=1) and registerdate='04/07/2017'
UNION
select * from dbo.Students1 where (@FilterArchived=1 AND @FilterREgisterDate!=1) and archived=1
我在这里使用 MS SQL
创建了一个简单的 tableCREATE TABLE Students1 (
FirstName Nvarchar(100),
SecondName Nvarchar(100),
DOB Smalldatetime,
RegisterDate smalldatetime,
Archived int,
ArchivedDate Smalldatetime
);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('James','Bike',16/04/1900, 04/07/2017,0,Null);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Adam','Bike',16/04/1901,04/07/2017,0,Null);
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Chris','Bike',16/04/1902,04/09/2017,1,getdate());
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Sam','Bike',16/04/1999,04/09/2017,1,getdate());
Insert Into Students1(FirstName,SecondNAme,DOB,RegisterDate,Archived,ArchivedDate)
Values('Josh','Bike',16/04/1999,04/09/2017,1,getdate());
我想针对此做一个简单的 select 声明,我根据我的局部变量的设置方式过滤 RegisterDate
或 ArchivedDate
。
例如,我将设置以下局部变量;
@FitlerRegisterDate
@FilterArchived
如果 @FilterREgisterDate
设置为 1,则 where 子句将查看 RegisterDate
列,但如果 @FilterArchived
设置为 1,则 where 子句将查看 ArchivedColumn
如果它们都设置为 1 那么它应该默认查看 RegisterDate
我已经看了一段时间了,看不出有什么突出的地方。如果有人能给我指出正确的方向,那就太好了。
谢谢。
您可以使用 AND
和 OR
子句根据您的变量值进行过滤:
SELECT *
FROM dbo.Students1
WHERE ( @FilterArchived = 1
AND @FilterREgisterDate = 1
AND RegisterDate = @dateToFilter )
OR ( ( @FilterREgisterDate = 1
AND RegisterDate = @dateToFilter )
OR ( @FilterArchived = 1
AND ArchivedDate = @dateToFilter ) )
像这样:
SELECT *
FROM Students1
WHERE @FilterREgisterDate = 1 AND RegisterDate = @RegisterDate
OR @FilterREgisterDate <> 1 AND @FilterArchived = 1 AND ArchivedDate = @ArchivedDate
;
?
select * from dbo.Students1 where (@FilterArchived=1 AND @FilterREgisterDate=1) and registerdate='04/07/2017'
UNION
select * from dbo.Students1 where (@FilterArchived!=1 AND @FilterREgisterDate=1) and registerdate='04/07/2017'
UNION
select * from dbo.Students1 where (@FilterArchived=1 AND @FilterREgisterDate!=1) and archived=1