我有一个Employee
表,它的工作原理是,当添加新员工时,列[DOR]
将为空,[Status]
将为1.当员工正在从公司解除后,[DOR]
列值将是他/她离开公司的日期,[Status]
设置为0。
我需要获取在给定日期可用的所有员工的详细信息。必须提取Status
为1的员工以及直到该日期尚未解除的员工。
但我无法像在等同DOR
时那样做,它的空值并没有返回任何行。
如果我将输入设为2015-02-10
,它应该获取两个记录,当我提供2015-02-15
时,它应该只获取第一个记录。
CREATE TABLE [Employee]
(
[EmployeeId] [int] IDENTITY(1000,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[RoleId] [int] NOT NULL,
[Email] [varchar](50) NULL,
[Contact] [varchar](50) NULL,
[DOJ] [date] NOT NULL,
[DOR] [date] NULL,
[Status] [bit] NOT NULL,
[Salary] [decimal](18, 2) NULL
)
INSERT [dbo].[Employee] ([EmployeeId], [Name], [RoleId], [Email], [Contact], [DOJ], [DOR], [Status], [Salary])
VALUES (1001, N'Employee 1', 3, N'', N'', CAST(0x8D390B00 AS Date), NULL, 1, CAST(6000.00 AS Decimal(18, 2)))
INSERT [dbo].[Employee] ([EmployeeId], [Name], [RoleId], [Email], [Contact], [DOJ], [DOR], [Status], [Salary])
VALUES (1002, N'Employee 2', 7, N'', N'', CAST(0x8D390B00 AS Date), CAST(0x9A390B00 AS Date), 0, CAST(4000.00 AS Decimal(18, 2)))
答案 0 :(得分:3)
您需要在条件中使用IS NULL
运算符而不是= NULL
,如下所示:
SELECT *
FROM Employee
WHERE DOJ <= '2015-02-15'
AND (DOR IS NULL OR DOR > '2015-02-15')
答案 1 :(得分:1)
这样的东西?
select
EmployeeId,
Name
from
Employee
where
DOJ <= @searchDate and
(DOR is null or DOR > @searchDate)
答案 2 :(得分:0)
试试这个:
SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, '2099-12-31')
此查询的作用是检查搜索日期是否在开始日期和结束日期之间。如果结束日期为null
,则COALESCE
函数用于获取非常高的值日期。
答案 3 :(得分:0)
之前答案的另一种变体: - )
SELECT * FROM Employee
WHERE @dateOfSearch BETWEEN DOJ and COALESCE(DOR, @dateOfSearch)