SQL Server дата и время, как выбрать? - PullRequest
84 голосов
/ 27 октября 2009

в MySQL

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

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

Ответы [ 10 ]

127 голосов
/ 27 октября 2009

Вы можете использовать функцию 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 для получения полного списка допустимых аргументов.

53 голосов
/ 27 октября 2009

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

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

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

Марк

10 голосов
/ 27 октября 2009

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

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

7 голосов
/ 06 июня 2014

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

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
7 голосов
/ 27 октября 2009

Вы можете использовать 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'
3 голосов
/ 22 сентября 2011

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

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
2 голосов
/ 07 июля 2016

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

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

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

* CASTING OpenDt, потому что его значение в DATETIME, а не просто DATE.

1 голос
/ 29 августа 2018

Я немного опоздал к этой теме, но на самом деле есть прямая поддержка оператора like на сервере MS SQL.

Как описано в справке LIKE, если тип данных не является строкой, он пытается преобразовать его в строку. И как указано в документации по приведениям \ конвертации:

Преобразование даты и времени в строку по умолчанию - тип 0 (, 100), то есть mon dd гггг чч: 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 каноническое (с миллисекундами) значение по умолчанию для времени, date, 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%';

Выполнение поиска по дате и времени на сервере SQL без преобразования в строку всегда было проблематичным. Получение каждой части даты является излишним (что вряд ли будет использовать индекс). Вероятно, лучший способ, когда вы не используете преобразование строк, это использовать проверки диапазона. то есть:

select * from record 
where register_date >= '20091010' and register_date < '20091011';
1 голос
/ 09 января 2013

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

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

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

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

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

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

Мне было трудно придумать процесс на НРАВИТСЯ секунд, поэтому, если кто-то захочет пойти еще дальше, будьте моим гостем!

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

0 голосов
/ 24 февраля 2017

Я решил свою проблему таким образом. Спасибо за предложения по улучшению. Пример в 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 + "%'";
...