在 MySQL 中
select * from record where register_date like '2009-10-10%'
SQL Server 中的语法是什么?
在 MySQL 中
select * from record where register_date like '2009-10-10%'
SQL Server 中的语法是什么?
您可以使用 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
这将允许它使用索引(如果有一个 on register_date
),而不是表扫描。
您可以使用 CONVERT 以文本形式获取日期。如果将其转换为 varchar(10),则可以使用 = 而不是 like:
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'
不幸的是,无法使用 'LIKE' 将日期时间与 varchar 进行比较,但可以通过另一种方式获得所需的输出。
select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
尝试这个
SELECT top 10 * from record WHERE IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'
您还可以使用 convert 使日期可使用 LIKE 进行搜索。例如,
select convert(VARCHAR(40),create_date,121) , * from sys.objects where convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
我对这个线程有点晚了,但实际上 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 -- 时间、日期、datetime2 和 datetimeoffset 的 ODBC 规范(以毫秒为单位)默认值。-- 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 中进行日期时间搜索而不转换为字符串一直是有问题的。获取每个日期部分是一种矫枉过正(不太可能使用索引)。当您不使用字符串转换时,可能更好的方法是使用范围检查。IE:
select * from record
where register_date >= '20091010' and register_date < '20091011';
LIKE
运算符不使用月份或日期等日期部分,但运算DATEPART
符可以使用。
命令查找所有开户日期为 1 日的帐户:
SELECT *
FROM Account
WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`
*CASTINGOpenDt
因为它的价值在于,DATETIME
而不仅仅是DATE
.
SQL Server 中对日期的 LIKE 运算符的覆盖率非常不稳定。它仅适用于美国日期格式。例如,您可以尝试:
... 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 秒的过程,所以如果有人想更进一步,请成为我的客人!
希望这可以帮助。
我意识到这是一个老问题,但这里的很多答案都没有给出 SARGable 答案,也没有涵盖参数化。
首先,你最好使用>=
和<
逻辑。对于您想要的日期,它将如下所示:
SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= '20091010'
AND register_date < '20091011';
这将包括 2009 年 10 月 10 日的每个时间值,包括当天的午夜钟声和 2009 年 10 月 11 日之前的纳秒。
但是,您通常会对查询进行参数化,因此您可以做的是DATEADD
在第二个子句中添加一天:
DECLARE @DateParam date = '20091010';
SELECT {Your Columns}
FROM dbo.record
WHERE register_date >= @DateParam
AND register_date < DATEADD(DAY,1,@DateParam);
这保持了 SARGability 并意味着register_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 + "%'";