SQL Server datetime LIKE выберите?

в MySQL

select * from record where register_date like '2009-10-10%'

Каков синтаксис SQL Server?

Спасибо.

Ответ 1

Вы можете использовать функцию DATEPART()

SELECT * FROM record 
WHERE  (DATEPART(yy, register_date) = 2009
AND    DATEPART(mm, register_date) = 10
AND    DATEPART(dd, register_date) = 10)

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

AND    DATEPART(hh, register_date) = 12)

чтобы получить записи между 12 и 1.

Проконсультируйтесь с документами MSDN DATEPART для полного списка допустимых аргументов.

Ответ 2

Нет прямой поддержки оператора LIKE для переменных DATETIME, но вы всегда можете отнести DATETIME к VARCHAR:

SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'

Проверьте документы MSDN для получения полного списка доступных "стилей" в функции CONVERT.

Марк

Ответ 3

Если вы это сделаете, вы вынуждаете его выполнять преобразование строк. Было бы лучше построить диапазон дат начала и окончания и использовать:

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), а не сканирование таблицы.

Ответ 4

Вы можете использовать CONVERT для получения даты в текстовой форме. Если вы преобразуете его в varchar (10), вы можете использовать = вместо следующего:

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'

Ответ 5

К сожалению, невозможно сравнить datetime с varchar, используя 'LIKE' Но желаемый выход возможен по-другому.

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0

Ответ 6

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

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'

Ответ 7

Существует очень слабое освещение оператора LIKE для дат в SQL Server. Он работает только с использованием американского формата даты. В качестве примера вы можете попробовать:

... WHERE register_date LIKE 'oct 10 2009%'

Я тестировал это в SQL Server 2005, и он работает, но вам действительно нужно попробовать разные комбинации. Нечетные вещи, которые я заметил, следующие:

  • Похоже, вы получаете все или ничего для разных подполей в дате, например, если вы ищете "apr 2%", вы получаете только что-либо в 20-м - он пропускает 2-й.

  • Использование одного символа подчеркивания '_' для представления одиночного (группового) символа не работает полностью, например WHERE mydate LIKE 'oct _ 2010%' будет не возвращать все даты до 10-го - он вообще ничего не возвращает, на самом деле!

  • Формат жестко американец: 'mmm dd yyyy hh:mm'

Мне было сложно скрыть процесс для LIKEing секунд, поэтому, если кто-то захочет принять это немного дальше, будьте моим гостем!

Надеюсь, что это поможет.

Ответ 8

Оператор LIKE не работает с частями даты, такими как месяц или дата, но оператор DATEPART делает.

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

SELECT * 
  FROM Account 
 WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`

* CASTING OpenDt, потому что это значение находится в DATETIME, а не только DATE.

Ответ 9

Я решил свою проблему таким образом. Благодарим вас за предложения по улучшению. Пример в С#.

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 + "%'";