Я немного опоздал к этой теме, но на самом деле есть прямая поддержка оператора 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';