2016-06-10 114 views
0

我有一个表指定负责所有employees.In,每当角色得到改变,新的条目将there.Like月,年中beween两个日期当一个日期为null

“老Engg'-开始日期2013年4月1日和结束日期2016年3月31日

现在一样的家伙得到提升到

“引领工程证书” - 开始日期2016年4月1日和结束日期'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语句:

INSERT INTO `simpayroll`.`role` 
(`id`, 
`employee`, 
`role`, 
`startdate`, 
`enddate`) 
VALUES 
(<{id: }>, 
<{employee: }>, 
<{role: }>, 
<{startdate: }>, 
<{enddate: }>); 
+0

难道不是一个未知的结束日期仅仅是NULL?在这种情况下,您可以使用COALESCE(enddate,CURDATE())。 – Strawberry

+0

我设置默认值为空,但仍然当我离开,它显示插入时的错误。所以我用'0000-00-00' – Anu

+0

它显示什么错误? – Strawberry

回答

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是空的,而不是0000-00-00,这是更理想,你可以它modifiy到:

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

从查询中,它返回的是行ID 2,但2016年3月它应该返回行ID 1.因为,用户将选择月份和年份,使用此数据我必须在数据库中进行搜索。 – Anu

+0

@anu用户将选择月份和年份,但您需要的是每月的第一天始终为1,我建议您使用此方法 – fthiella

相关问题