#sql-server #ssms
#sql-сервер #ssms
Вопрос:
Привет, у меня есть несколько записей в таблице sql server, которая содержит значения datetime2. Когда я запускаю оператор select, я получаю следующее для столбца UPDATEDATETIME:
UPDATEDATETIME
2021-02-11 23:14:05.727
2021-02-11 22:08:01.960
2021-02-10 19:28:10.263
2021-02-10 19:28:10.263
2021-02-10 19:28:10.263
2021-02-10 19:28:10.263
Я хотел получить только значения из 2021-02-10, поэтому я написал следующий запрос:
select * from dbo.logtable where UPDATEDATETIME like '2021-02-10%'
Однако это не возвращает никаких значений. Я всегда предполагал, что могу использовать это сопоставление с шаблоном для поиска datetimes, поскольку можно ввести datetime в виде строки?
Как я могу получить только даты, которые приходятся на 2021-02-10?
Ответ №1:
Используйте диапазон.
SELECT *
FROM dbo.logtable
WHERE updatedatetime >= '2021-02-10'
AND updatedatetime < '2021-02-11';
Комментарии:
1. Я предполагаю, что для datetime нет такого понятия, как регулярное выражение?
2. Это лучший метод, поскольку он хорошо работает с индексами. Если у вас есть конкретная дата в переменной, используйте
updatedatetime >= @date AND updatedatetime < DATEADD(day, 1, @date)
@dozie419, если вы действительно не хотите этого делать. Используйте функции даты для манипулирования датами, они самые лучшие.
Ответ №2:
Кастинг поможет.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, UPDATEDATETIME DATETIME2(3));
INSERT INTO @tbl (UPDATEDATETIME) VALUES
('2021-02-11 23:14:05.727'),
('2021-02-11 22:08:01.960'),
('2021-02-10 19:28:10.263'),
('2021-02-10 19:28:10.263'),
('2021-02-10 19:28:10.263'),
('2021-02-10 19:28:10.263');
-- DDL and sample data population, end
SELECT * FROM @tbl
WHERE CAST(UPDATEDATETIME AS DATE) = '2021-02-10';
Вывод
---- -------------------------
| ID | UPDATEDATETIME |
---- -------------------------
| 3 | 2021-02-10 19:28:10.263 |
| 4 | 2021-02-10 19:28:10.263 |
| 5 | 2021-02-10 19:28:10.263 |
| 6 | 2021-02-10 19:28:10.263 |
---- -------------------------
Комментарии:
1.Приведение допустимо, но это может быть не лучшим выбором.
2. СМор, я согласен. Написал свой ответ, не задумываясь.
Ответ №3:
Вы можете использовать этот запрос:
SELECT *
FROM dbo.logtable
WHERE UPDATETIME >= '2021-02-10';