mysql - 当一个日期为空时,两个日期之间的月、年

标签 mysql

我有一个所有员工的指定表。每当角色发生变化时,就会有新的条目。就像

'Sr. Engg'- start date 2013-04-01 and end date 2016-03-31

现在同一个人晋升为

'Lead Engg' -start date 2016-04-01 and end date'0000-00-00'

因为我不知道目前职位的结束日期。

我正在使用此表格在工资单中显示它。所以当他想要 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: }>);

最佳答案

我建议您使用这样的查询:

SELECT
  *
FROM
  ROLE
WHERE
  EMPLOYEE = 1 AND (
    STARTDATE>='2016-03-01'
    AND (ENDDATE<=LAST_DAY('2016-03-01') OR ENDDATE='0000-00-00')
  );

我知道在这里我们重复相同的日期(该月的第一天)两次,但这将是性能最高的,因为我们将日期与没有字符串转换的日期进行比较,并且可以利用索引(如果存在) .

如果ENDDATE为空而不是更可取的0000-00-00,您可以将其修改为:

    ....
    AND (ENDDATE<=LAST_DAY('2016-03-01') OR ENDDATE IS NULL)

关于mysql - 当一个日期为空时,两个日期之间的月、年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37741591/

相关文章:

javascript - Angular 和 php/mysql 中的路由

MySQL可以通过命令行连接远程,但Laravel失败

mysql - 不像 MySQL select 语句不返回正确的结果

javascript - Google Places 使用 PHP 将结果存储在 Mysql 中

php - 如何仅从 MySql 数据库表中获取特定行

php - 把Array json放到mysql返回Array

mysql - 使用Scala和spark从mysql中提取数据

mysql - 将西里尔字母值插入 MySQL 数据库值时,它们看起来是 "?????"

php - 如何将寄存器保存到子索引数组中?

mysql - Phpmailer 在 html 电子邮件中删除名称值,但使用纯文本?