我对这个线程有点晚了,但实际上 MS SQL 服务器中直接支持 like 运算符。
如 LIKE 帮助中所述,如果数据类型不是字符串,则会尝试将其转换为字符串。正如 cast\convert 文档中所述:
默认日期时间转换为字符串类型为 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 规范(以毫秒为单位)默认时间,
日期、日期时间 2 和日期时间偏移量。 -- yyyy-mm-dd hh:mi:ss.mmm(24h)
这样更容易,您可以使用:
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 Server 中进行日期时间搜索一直存在问题。获取每个日期部分是一种矫枉过正(不太可能使用索引)。当您不使用字符串转换时,可能更好的方法是使用范围检查。即:
select * from record
where register_date >= '20091010' and register_date < '20091011';