2014-02-17 3 views
-1

общее количество сотрудников, а также показать работника, имеющего более 5 лет опыта работы ...рассчитать опыт сотрудника

Пожалуйста, помогите мне. Благодарим вас в Advance.

SELECT tbl_Employee.EFirstName, 
     tbl_Employee.EMiddleName, 
     tbl_Employee.ELastName, 
     tbl_Empl‌​oyee.EmployeeID, 
     tbl_BranchMaster.BranchName, 
     tbl_DepartmentMaster.DepartmentName, 
     tbl_StateMaster.‌​StateName, 
     tbl_Employee.EmployeementDate, 
     dbo.FN_Basic(tbl_Employee.EmployeeID) AS basic, 
     YEAR(CURDATE())-YEAR(tbl_Employee.EmployeementDate) AS Age 
FROM tbl_StateMaster 
INNER JOIN tbl_DepartmentMaster 
INNER JOIN tbl_EmployeeStructure 
INNER JOIN tbl_Employee ON tbl_EmployeeStructure.EmployeeID = tbl_Employee.EmployeeID 
INNER JOIN tbl_BranchMaster ON tbl_EmployeeStructure.BranchID = tbl_BranchMaster.BranchID 
          ON tbl_DepartmentMaster.DepartmentID = tbl_EmployeeStructure.DepartmentID 
          ON tbl_StateMaster.StateID =tbl_EmployeeStructure.StateID 
+6

Пожалуйста, пост полный SQL вы пробовали, и указать, в чем проблема с этим. Кроме того, уточните, является ли это MySQL или SQL Server, потому что они имеют различный синтаксис. – wdosanjos

+0

ВЫБОР tbl_Employee.EFirstName, tbl_Employee.EMiddleName, tbl_Employee.ELastName, tbl_Employee.EmployeeID, tbl_BranchMaster.BranchName, tbl_DepartmentMaster.DepartmentName, tbl_StateMaster.StateName, tbl_Employee.EmployeementDate, dbo.FN_Basic (tbl_Employee.EmployeeID) в качестве основных, Год (CURDATE()) -YEAR (tbl_Employee.EmployeementDate) как возраст – user3319082

+0

ОТ tbl_StateMaster INNER JOIN tbl_DepartmentMaster INNER JOIN tbl_EmployeeStructure INNER JOIN tbl_Employee ПО tbl_EmployeeStructure.EmployeeID = tbl_Employee.EmployeeID INNER JOIN ON tbl_BranchMaster tbl_EmployeeStructure.BranchID = tbl_BranchMaster.BranchID ПО tbl_DepartmentMaster.DepartmentID = tbl_EmployeeStructure. DepartmentID ON tbl_StateMaster.StateID = tbl_EmployeeStructure.StateID – user3319082

ответ

2
DROP TABLE IF EXISTS employee; 

CREATE TABLE employee(id INT , joining_date DATETIME); 

INSERT INTO `employee` (`id`, `joining_date`) VALUES ('1', NOW()),('2',NOW() - INTERVAL 6 YEAR); 

SELECT * FROM employee; 
+------+---------------------+ 
| id | joining_date  | 
+------+---------------------+ 
| 1 | 2014-02-17 17:56:53 | 
| 2 | 2008-02-17 17:56:53 | 
+------+---------------------+ 
2 rows in set (0.00 sec) 

SELECT id,joining_date FROM employee WHERE DATEDIFF(DATE(NOW()),DATE(joining_date))/365 > 5; 
+------+---------------------+ 
| id | joining_date  | 
+------+---------------------+ 
| 2 | 2008-02-17 17:56:53 | 
+------+---------------------+ 
1 row in set (0.01 sec) 

Вы также можете попробовать

SELECT id,joining_date,DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(joining_date)),'%Y')+0 AS YearsOfExp FROM employee WHERE DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(joining_date)),'%Y')+0 > 5; 
+------+---------------------+------------+ 
| id | joining_date  | YearsOfExp | 
+------+---------------------+------------+ 
| 2 | 2008-02-17 17:56:53 |   6 | 
+------+---------------------+------------+ 
1 row in set (0.00 sec) 

Для лучшего использования индексов вы можете записать его как

SELECT * FROM employee WHERE joining_date <= DATE_ADD(NOW(), INTERVAL -5 YEAR); 
+0

[DATEDIFF] (http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff) вернет количество днейразница, а не количество лет, поэтому через 6 дней оба сотрудника будут возвращены вашим запросом. Кроме того, использование функций в столбце делает запрос недоступным. Гораздо лучшее решение было бы следующим: 'WHERE joining_date <= DATE_ADD (NOW(), INTERVAL -5 YEAR)' - [Demo on SQL Fiddle] (http://sqlfiddle.com/#!2/579094/2) (* Обратите внимание на использование индекса при входе в окончательный запрос) * – GarethD

+0

Надеюсь, что деление на 365 должно работать. –

+0

Это было бы почти, хотя и не учитывает високосные годы. Тем не менее, он по-прежнему не доступен [http://www.wikipedia.org/wiki/Sargable]. По возможности никогда не используйте функции в столбцах, где вы можете избежать этого, вместо этого используйте функцию для констант (например, 'NOW()'). – GarethD

Смежные вопросы