SQL Server datetime как выбрать?

в MySQL

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

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

спасибо.

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 документы полный список допустимых аргументы.


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

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

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

Марк


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

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), вы можете использовать = вместо:

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-е.--4-->

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

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

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

надеюсь, что это помогает.


на 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 help, если тип данных не является строкой, его пытаются преобразовать в строку. И как описано в документации cast\convert:

по умолчанию преобразование datetime в string имеет тип 0 (, 100), который является mon dd yyyy hh: miAM (или PM).

если у вас есть дата, как это в ДБ:

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 canonical (с миллисекундами) по умолчанию для времени, дата, 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';