一个日期为空时,在两个日期之间的月份,年份

时间:2016-06-10 06:44:18

标签: mysql

我有一个表格可供所有员工使用。在每当角色发生变化时,都会有新的参赛作品。就像

  

'锶。 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 = 1mar 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: }>);

1 个答案:

答案 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)