10 ответов:
вы можете использовать функцию 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 docs для полного списка действительных аргументы.
нет прямой поддержки оператора LIKE для переменных DATETIME, но вы всегда можете привести DATETIME к VARCHAR:
SELECT (list of fields) FROM YourTable WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'Регистрация MSDN docs для полного списка доступных "стилей"в функции преобразования.
Марк
Если вы это сделаете, вы заставляете его делать преобразование строк. Было бы лучше построить диапазон дат начала/конца и использовать:
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), а не сканирование таблицы.
вы можете использовать преобразование, чтобы получить дату в текстовой форме. Если вы преобразовать его в 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'
к сожалению, невозможно сравнить 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 для дат в 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 секунд, так что если кто-то хочет взять это немного дальше, Будьте моим гостем!
надеюсь, что это помогает.
The
LIKEоператор не работает с частями даты, такими как месяц или дата, ноDATEPARTоператора.команда, чтобы узнать все учетные записи, дата открытия которых была на 1-м:
SELECT * FROM Account WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`*литье
OpenDtпотому что это значение находится вDATETIMEи не толькоDATE.
Я решил свою проблему таким образом. Спасибо за предложения по улучшению. Пример в 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 + "%'";
Я немного опоздал к этому потоку, но на самом деле есть прямая поддержка оператора like в MS SQL server.
как описано в справке LIKE если тип данных не является строкой, он пытается преобразовать его в строку. И как описано в документации cast\convert:
по умолчанию преобразование даты и времени в строку имеет тип 0 (, 100), который является mon dd гггг чч: миам (или ПМ).
если у вас есть дата, как это в ДБ:
2015-06-01 11:52:59.057и вы делаете такие запросы:
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, то документация говорит:
21 или 121 -- ODBC канонический (с миллисекундами) по умолчанию для времени, дата, datetime2 и datetimeoffset. -- гггг-ММ-ДД чч:Ми:СС.МММ (24 часа)
что делает его легче и вы можете использовать:
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%';выполнение поиска datetime в SQL server без преобразования в строку всегда было проблематичным. Получение каждой части даты является излишним (что вряд ли будет использовать индекс). Вероятно, лучшим способом, когда вы не используете преобразование строк, было бы использовать проверки диапазона. т. е.:
select * from record where register_date >= '20091010' and register_date < '20091011';
Comments