в MySQL
select * from record where register_date like '2009-10-10%'
Каков синтаксис в SQL Server?
sql-server
sql-like
Paisal
источник
источник
DATETIME
значениями, такими как строки, и почему это может быть плохо использоватьBETWEEN
или>= AND <=
), см. Этот блог Аарона Бертрана .5
голосов за тег " Нравится" . Могу я попросить вас предложить sql-like в качестве синонима ?Ответы:
Вы можете использовать функцию DATEPART ()
SELECT * FROM record WHERE (DATEPART(yy, register_date) = 2009 AND DATEPART(mm, register_date) = 10 AND DATEPART(dd, register_date) = 10)
Мне этот способ легко читать, поскольку он игнорирует компонент времени, и вам не нужно использовать дату следующего дня, чтобы ограничить свой выбор. Вы можете перейти к большей или меньшей степени детализации, добавив дополнительные предложения, используя соответствующий код DatePart, например
чтобы получить записи от 12 до 1.
Обратитесь к документации MSDN DATEPART для полного списка действительных аргументов.
источник
Нет прямой поддержки оператора LIKE для переменных DATETIME, но вы всегда можете преобразовать DATETIME в VARCHAR:
SELECT (list of fields) FROM YourTable WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'
Проверьте документы MSDN для получения полного списка доступных «стилей» в функции CONVERT.
Марк
источник
WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
Если вы это сделаете, вы заставите его выполнить преобразование строки. Было бы лучше создать диапазон дат начала / окончания и использовать:
declare @start datetime, @end datetime select @start = '2009-10-10', @end = '2009-11-10' select * from record where register_date >= @start and register_date < @end
Это позволит использовать индекс (если он включен
register_date
), а не сканирование таблицы.источник
Вы можете использовать CONVERT, чтобы получить дату в текстовой форме. Если вы конвертируете его в varchar (10), вы можете использовать = вместо like:
select * from record where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'
Или вы можете использовать верхнюю и нижнюю граничные даты с дополнительным преимуществом, заключающимся в использовании индекса:
select * from record where '2009-10-10' <= register_date and register_date < '2009-10-11'
источник
К сожалению, невозможно сравнить datetime с varchar с помощью LIKE, но желаемый результат возможен и другим способом.
select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
источник
Вы также можете использовать convert, чтобы сделать дату доступной для поиска с помощью LIKE. Например,
select convert(VARCHAR(40),create_date,121) , * from sys.objects where convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
источник
LIKE
Оператор не работает с датой частей , как месяц или дату , ноDATEPART
оператор делает.Команда, чтобы узнать все счета, Дата открытия которых была 1-го:
SELECT * FROM Account WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`
* ЛИТЬЕ,
OpenDt
потому что это ценность,DATETIME
а не просто такDATE
.источник
Попробуй это
SELECT top 10 * from record WHERE IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'
источник
Оператор LIKE для дат в SQL Server очень ненадежен. Работает только с американским форматом даты. В качестве примера вы можете попробовать:
Я тестировал это в SQL Server 2005, и он работает, но вам действительно нужно попробовать разные комбинации. Я заметил следующие странные вещи:
Кажется, вы получаете только все или ничего для разных подполей в пределах даты, например, если вы ищете «апр 2%», вы получаете только 20-е число - оно пропускает 2-е.
Использование одного подчеркивания «_» для представления одного (подстановочные) характер не полностью работы, например,
WHERE mydate LIKE 'oct _ 2010%'
будет не возвращать все даты до того того 10 - это не возвращает ничего, на самом деле!Формат жесткий американский: '
mmm dd yyyy hh:mm
'Мне было трудно описать процесс за несколько секунд, так что если кто-то хочет пойти дальше, будь моим гостем!
Надеюсь это поможет.
источник
Я немного опоздал в эту ветку, но на самом деле есть прямая поддержка подобного оператора в сервере MS SQL.
Как описано в справке LIKE, если тип данных не является строкой, выполняется попытка преобразовать его в строку. И как описано в документации cast \ convert:
Если у вас есть такая дата в БД:
и вы делаете такие запросы:
select * from wws_invoice where invdate like 'Jun%' select * from wws_invoice where invdate like 'Jun 1%' select * from wws_invoice where invdate like 'Jun 1 %' select * from wws_invoice where invdate like 'Jun 1 2015:%' select * from wws_invoice where invdate like 'Jun ? 2015%' ... select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM'
вы получите эту строку.
Однако этот формат даты предполагает, что это DateTime2 , тогда в документации говорится:
Это упрощает задачу, и вы можете использовать:
select * from wws_invoice where invdate like '2015-06-01%'
и получите счет-фактуру. Вот демонстрационный код:
DECLARE @myDates TABLE (myDate DATETIME2); INSERT INTO @myDates (myDate) VALUES ('2015-06-01 11:52:59.057'), ('2015-06-01 11:52:59.054'), ('2015-06-01 13:52:59.057'), ('2015-06-01 14:52:59.057'); SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%'; SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%';
Выполнение поиска по дате и времени на SQL-сервере без преобразования в строку всегда было проблематичным. Получение каждой части даты - излишество (при котором вряд ли будет использоваться индекс). Вероятно, лучший способ, когда вы не используете преобразование строк, - это использовать проверки диапазона. то есть:
select * from record where register_date >= '20091010' and register_date < '20091011';
источник
Так я решил свою проблему. Спасибо за предложения по улучшению. Пример на C #.
string dd, mm, aa, trc, data; dd = nData.Text.Substring(0, 2); mm = nData.Text.Substring(3, 2); aa = nData.Text.Substring(6, 4); trc = "-"; data = aa + trc + mm + trc + dd; "Select * From bdPedidos Where Data Like '%" + data + "%'";
источник