2016-06-10 118 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

相關問題