我正在处理的表是一个员工登录数据库。除其他事项外,它将能够识别员工的进入时间,并报告他在一组日期内的进入情况。
我现在面临的问题是:当老板想看看工人在特定日期的登录和注销情况时。他想:
a( 设置日期和名称,并使查询返回该员工在该特定日期的访问权限。
b( 如果他没有输入名字,那么它将返回该日期每个人的列表。
No | Name | ID | Date | Log-in | Log-out | Description
---+------+-----+------------+--------+---------+---------------------
1 | Joe1 | j1 | 2018/10/02 | 09:00 | 18:00 | Normal Exit
2 | Joe2 | j2 | 2018/10/02 | 10:00 | 17:00 | Meeting
.. | ... | . | . . . | . . | . . . | . . . .
N | JoeN | jN | yyyy/mm/dd | hh/mm | hh/mm | Whatever text
所以对于第一部分,我用一个简单的
select *
from DB
where @name = '*the name of the person to look for*'
and @date = '*specific date*' (is a date variable yyyy-mm-dd)
全部完成。现在下一部分似乎很奇怪,还无法弄清楚。
我正在尝试将 IIF 方案作为子查询,但没有执行它返回完整列表的部分。
接下来是在哪里,但也不能让它工作。我缺少程序要检查的变量:
如果没有要查找的名称=>当天与每个人一起显示表
如果有要查找的名称 =>仅显示该人的表
如何使我的程序区分最后显示哪个表?
干杯!
编辑:
已添加(感谢您的建议(查询以获得更好的帮助
CREATE TABLE DailyRegisters
(
No INTEGER NOT NULL PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
ID VARCHAR(50) NOT NULL,
Date DATE NOT NULL,
Login DATETIME NOT NULL,
Logout DATETIME NOT NULL,
Description VARCHAR(50) NOT NULL
);
INSERT INTO DailyRegisters (No, Name, ID, Date, Login, Logout, Description)
VALUES (1,'Person 1','P1','10/2/2018','9:00','18:00','Normal'),
(2,'Person 2','P2','10/2/2018','9:01','18:00','Normal'),
(3,'Person 3','P3','10/2/2018','10:17','16:00','Plant'),
(4,'Person 4','P4','10/2/2018','10:10','18:00','Normal'),
(5,'Person 1','P1','10/3/2018','9:01','18:00','Normal'),
(6,'Person 2','P2','10/3/2018','9:02','18:00','Normal'),
(7,'Person 3','P3','10/3/2018','9:04','18:00','Normal'),
(8,'Person 1','P1','10/4/2018','9:00','18:00','Normal'),
(9,'Person 2','P2','10/4/2018','9:00','14:00','Meeting'),
(10,'Person 3','P3','10/4/2018','9:17','18:00','Normal'),
(11,'Person 4','P4','10/4/2018','9:00','18:00','Normal'),
(12,'Person 1','P1','10/5/2018','9:00','18:00','Normal'),
(13,'Person 3','P3','10/5/2018','9:00','20:00','Plant'),
(14,'Person 4','P4','10/5/2018','9:00','18:00','Normal');
您只需要处理未指定名称的情况,如下所示:
select * from DB
where
((@name is not null AND name = @name) or (@name is null))
AND date = @date;
基本上,如果@name参数为空,则上述查询不会检查名称。当然,不言而喻,@name
和@date
是传递给查询的参数。
我还建议不要使用select *
而是指定列: 最好在表架构更改的情况下进行维护。