Избегать жесткого кодирования даты, которую я хочу найти в SQL? - PullRequest
0 голосов
/ 18 октября 2019

Вот вопрос:

Все сотрудники (полные имена, пожалуйста!) И навыки, которые необходимо обновить в следующем году. Не указывайте дату в вашем запросе жестко.

Ниже показано, как я это сделал, но дата в ней жестко закодирована. Я хочу получить возможность получить следующий год независимо от того, когда мне нужно было начать поиск.

SELECT CONCAT(firstName, surname) as 'Full Name',skillId, dateLapses  From EmployeeSkill
Full Join Employee ON EmployeeSkill.employeeId = Employee.id
Where Datepart(YYYY, dateLapses) = 2020;

Ниже приведен вывод, который я хочу скопировать без жесткого кодирования даты.

Judy                Jetson              Forklift    2020-09-11
Donald              Quagley             Forklift    2020-09-11

Ответы [ 2 ]

4 голосов
/ 18 октября 2019

Вы можете использовать:

SELECT CONCAT(firstName, surname) as FullName, skillId, dateLapses
WHERE EmployeeSkill Full Join
     Employee
     ON EmployeeSkill.employeeId = Employee.id
WHERE YEAR(dateLapses) = YEAR(DATEADD(YEAR, 1, GETDATE()));

Тем не менее, улучшенный запрос:

SELECT CONCAT(e.firstName, e.surname) as FullName, skillId, dateLapses
WHERE Employee e JOIN
      EmployeeSkill es
      ON es.employeeId = e.id
WHERE es.dateLapses >= DATEFROMPARTS(YEAR(GETDATE()) + 1, 1, 1) AND
      es.dateLapses < DATEFROMPARTS(YEAR(GETDATE()) + 2, 1, 1);

Примечания:

  • Укажите имена всех столбцов, поэтомуПонятно, откуда они берутся.
  • Используйте значимые псевдонимы таблиц, чтобы легче было писать и читать запрос.
  • FULL JOIN редко требуется и, конечно, не в этом случае. Предложение WHERE в любом случае превращает его в LEFT JOIN.
  • Логика даты не зависит от индекса ( sargable ), поскольку аргументы функций не берутся из табличных данных.
0 голосов
/ 18 октября 2019
SELECT CONCAT(e.firstName, e.surname) as FullName, es.skillId, es.dateLapses
FROM Employee e JOIN
      EmployeeSkill es
      ON es.employeeId = e.id
WHERE YEAR(es.dateLapses) = YEAR(GETDATE()) + 1

Если бы у вас не было большого количества данных и индекса для dateLapses, я бы использовал ниже. МЕЖДУ позволяет ему использовать индекс.

 es.dateLapses BETWEEN DATEFROMPARTS(YEAR(GETDATE()) + 1, 1, 1) AND
       DATEADD(SECOND, -1, DATEFROMPARTS(YEAR(GETDATE()) + 2, 1, 1));
...