SQL Запрос сотрудников, которые вступили в x год и месяц, не давая желаемого результата - PullRequest
0 голосов
/ 02 мая 2020

Запрос

Список сотрудников, которые присоединились в 1992 году

Таблица сотрудников

EmployeeID  LastName    Title                        BirthDate               HireDate
1            Davolio    Sales Representative        1948-12-08 00:00:00.000 1992-05-01 00:00:00.000
2            Fuller     Vice President, Sales       1952-02-19 00:00:00.000 1993-08-14 00:00:00.000
3            Leverling  Sales Representative        1963-08-30 00:00:00.000 1992-04-01 00:00:00.000

Код запроса

Select * from employees 
where HireDate like '1992%' 

Результат Я получаю нулевой результат. Как получить результат, когда год начинается с 1992 года

Тот же способ узнать сотрудников, принятых на работу в мае - 1992

Select * from employees where HireDate like '1992-05%'

Результаты в пустом виде и без столбцов

Ответы [ 3 ]

3 голосов
/ 02 мая 2020

Хотя преобразование в varchar представляется простым решением, его производительность не будет оптимальной, поскольку его нельзя использовать - индексы нельзя использовать после начала преобразования столбцов, т. Е. Путем их преобразования при использовании в where предложение.

Использование сравнения окон устраняет необходимость в функции и работает лучше следующим образом:

-- Find all employees hired in 2020
SELECT * 
FROM dbo.Employees 
WHERE Hiredate >= '01 Jan 2020' and HireDate < '01 Jan 2021'

-- Find all employees hired in May 2020
SELECT * 
FROM dbo.Employees 
WHERE Hiredate >= '01 May 2020' and HireDate < '01 Jun 2020'
1 голос
/ 02 мая 2020

Вам просто нужно изменить формат даты данных, которые вы запрашиваете, чтобы указать только год.

Мы можем сделать это, используя DATEPART(YY)

, например,

DATEPART(YY,hiredate)

Кроме того, вам нужно заменить LIKE для системы точного соответствия, используя =

WHERE DATEPART(YY,hiredate) = ('1992')

Поэтому ваш конечный скрипт должен быть;

SELECT 
* 
FROM employees 
WHERE DATEPART(YY,hiredate) = ('1992')
0 голосов
/ 02 мая 2020

LIKE - строковая функция. Но ваш столбец предположительно представляет собой какое-то значение даты / времени. Гораздо лучше использовать сравнения - используя стандартные форматы даты / времени. На ваш вопрос:

where HireDate >= '1992-01-01' and HireDate < '1993-01-01'

или:

where HireDate >= '19920101' and HireDate < '19930101'

В форме дефиса используются стандартные форматы даты ISO, которые работают при большинстве условий на SQL Сервере (в * есть одна настройка интернационализации SQL Сервер, на котором это не работает). Вторая использует SQL внутреннюю стандартную дату сервера, которая работает при любых обстоятельствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...