我有一个表格可供所有员工使用。在每当角色发生变化时,都会有新的参赛作品。就像
'锶。 Engg' - 开始日期2013-04-01和结束日期2016-03-31
现在同一个人被提升为
' Lead Engg' - 开始日期2016-04-01和结束日期' 0000-00-00'
因为我不知道这个角色的结束日期。
我使用此表在Payslip中显示它。因此,当他想要March 2016
的工资单时,他的工资单应该显示他的角色为Sr Engg
当他想要Apr 2016
时,那么该角色应该是' Lead Engg'
对于我使用一个查询,但它不起作用。
id empid role startdate enddate
1 1 Sr Engineer 2013-04-01 2016-03-31
3 2 Asst.Manager 2013-04-01 2016-03-31
2 1 Lead Engg 2016-04-01 0000-00-00
4 2 Manager 2016-04-01 0000-00-00
SELECT * FROM ROLE
WHERE EMPLOYEE = 1
AND ('2016-03' between DATE_FORMAT(STARTDATE,"%Y-%m") AND DATE_FORMAT(ENDDATE,"%Y-%m"));
它会返回employee = 1
,mar 2016
的记录,但对于同一个员工apr 2016
,它不会返回任何内容。
创建声明:
CREATE TABLE `role` (
`id` int(11) NOT NULL,
`employee` bigint(20) DEFAULT NULL,
`role` varchar(45) DEFAULT NULL,
`startdate` date DEFAULT NULL,
`enddate` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `Fk_role_employee_idx` (`employee`),
CONSTRAINT `Fk_role_employee` FOREIGN KEY (`employee`) REFERENCES `employee` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入声明:
INSERT INTO `simpayroll`.`role`
(`id`,
`employee`,
`role`,
`startdate`,
`enddate`)
VALUES
(<{id: }>,
<{employee: }>,
<{role: }>,
<{startdate: }>,
<{enddate: }>);
答案 0 :(得分:0)
我建议你使用这样的查询:
SELECT
*
FROM
ROLE
WHERE
EMPLOYEE = 1 AND (
STARTDATE>='2016-03-01'
AND (ENDDATE<=LAST_DAY('2016-03-01') OR ENDDATE='0000-00-00')
);
我知道这里我们重复相同的日期(一个月的第一天)两次,但这将是最高效的,因为我们将日期与没有字符串转换的日期进行比较,并且可以利用索引(如果存在)
如果ENDDATE为null而不是0000-00-00,这是更优选的,您可以将其修改为:
....
AND (ENDDATE<=LAST_DAY('2016-03-01') OR ENDDATE IS NULL)