Как найти шаблон с помощью DateTime в Sql Server

#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';