【问题标题】:Month,Year in beween two dates when one date is null当一个日期为空时,两个日期之间的月份,年份
【发布时间】:2016-06-10 06:44:17
【问题描述】:

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

'先生。 Engg'- 开始日期 2013-04-01 和结束日期 2016-03-31

现在同一个人升职了

'Lead Engg' - 开始日期 2016-04-01 和结束日期'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: }>);

【问题讨论】:

  • 未知的结束日期不会简单地为 NULL 吗?在这种情况下,您可以使用 COALESCE(enddate,CURDATE())。
  • 我将默认值设置为空,但是当我离开时它仍然在插入时显示错误。所以我用'0000-00-00'
  • 显示什么错误?
  • 不正确的日期值:第 1 行的列 'enddate' 为 'NULL'
  • 我们能看到插入语句和创建表语句吗?

标签: mysql


【解决方案1】:

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

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)

【讨论】:

  • 从您的查询中,它返回第 2 行,但对于 2016 年 3 月,它应该返回第 1 行。因为,用户将选择月份和年份,我必须使用这些数据在数据库中搜索。跨度>
  • @anu 用户将选择月份和年份,但您需要的是该月的第一天,它始终为 1,我建议您使用这种方法
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多