SQL Запрос на извлечение записей, указывающих c на дату без указания метки времени - PullRequest
0 голосов
/ 02 мая 2020

Запрос

Перечислите сотрудников, которые присоединились 1 мая 1992 г., 31 декабря c 1992 г., 7 апреля 1992 г. в порядке c старшинства.

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

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 1992-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-05-01' or 
      HireDate like '1992-12-31' or 
      HireDate like '1992-04-07' 
order by HireDate asc

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

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Не используйте like с датой / временем. Период. SQL Сервер преобразует строки в формате ГГГГ-ММ-ДД и ГГГГММДД в ​​даты, поэтому это может сбивать с толку, поскольку значения «выглядят» как строки. Но компилятор обрабатывает их как даты.

Если ни одна из ваших дат не имеет компонентов времени, тогда работают простые сравнения:

Select * 
from employees 
where HireDate = '1992-05-01' or 
      HireDate = '1992-12-31' or 
      HireDate = '1992-04-07' 
order by HireDate asc;

Как указывает Yoge sh, вы можете использовать IN для этого.

Если у вас есть ненулевые компоненты времени - что, как предполагают данные, возможно, то вы можете преобразовать значения в date:

where convert(date, HireDate) = '1992-05-01' or 
      convert(date, HireDate) = '1992-12-31' or 
      convert(date, HireDate) = '1992-04-07' 

Счастливо, SQL Сервер по-прежнему будет использовать индекс с этим преобразованием типов.

И вы можете использовать in с этим:

where convert(date, HireDate) in ('1992-05-01', '1992-12-31', '1992-04-07') 

Если вы действительно хотите рассматривать их как даты, тогда я предлагаю вам удалить компонент времени навсегда:

alter table employees alter column HireDate date;
1 голос
/ 02 мая 2020

Используйте одинарные кавычки & IN предложение:

Select * 
from employees 
where HireDate IN ('1992-05-01', '1992-12-31','1992-04-07 ')
order by HireDate asc;
0 голосов
/ 02 мая 2020

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

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

, как это

CONVERT(VARCHAR(10),hiredate,120)

Кроме того, вам необходимо заменить LIKE для точного соответствия системы. Поскольку вы работаете с несколькими параметрами поиска, я бы порекомендовал использовать IN и отдельный список запятых, чтобы упростить управление списком дат найма, например так.

WHERE HireDate IN ('1992-05-01','1992-12-31','1992-04-07')

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

SELECT 
* 
FROM employees 
WHERE CONVERT(VARCHAR(10),hiredate,120) IN ('1992-05-01','1992-12-31','1992-04-07')
ORDER BY HireDate ASC

Обратите внимание: если вы хотите перечислить «в порядке c старшинства», вам нужно будет создать отдельную таблицу, в которой перечислены названия должностей и какой-то «уровень». система или просто точная система нумерации, которая детализировала, какие должности были на каком уровне старшинства. В качестве альтернативы, если вы работаете с очень небольшим количеством должностей, как, например, в примерах данных, вы можете использовать оператор CASE для упорядочения результатов. например,

CASE Title WHEN 'President' THEN 1 'Vice President' THEN 2 ELSE 99 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...