104

在 MySQL 中

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

SQL Server 中的语法是什么?

4

12 回答 12

151

您可以使用 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 文档

于 2009-10-27T07:01:55.037 回答
66

没有直接支持 LIKE 运算符针对 DATETIME 变量,但您始终可以将 DATETIME 转换为 VARCHAR:

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

查看MSDN 文档以获取 CONVERT 函数中可用“样式”的完整列表。

马克

于 2009-10-27T06:37:08.460 回答
10

如果你这样做,你会强制它进行字符串转换。最好建立一个开始/结束日期范围,并使用:

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),而不是表扫描。

于 2009-10-27T06:37:35.293 回答
8

您可以使用 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'
于 2009-10-27T06:39:12.383 回答
7

不幸的是,无法使用 'LIKE' 将日期时间与 varchar 进行比较,但可以通过另一种方式获得所需的输出。

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0
于 2014-06-06T09:30:03.740 回答
4

尝试这个

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'
于 2020-01-14T11:26:01.740 回答
3

您还可以使用 convert 使日期可使用 LIKE 进行搜索。例如,

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'
于 2011-09-21T21:57:02.327 回答
3

我对这个线程有点晚了,但实际上 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';
于 2018-08-29T13:00:06.060 回答
2

LIKE运算符不使用月份或日期等日期部分,但运算DATEPART符可以使用。

命令查找所有开户日期为 1 日的帐户:

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

*CASTINGOpenDt因为它的价值在于,DATETIME而不仅仅是DATE.

于 2016-07-07T20:14:19.310 回答
1

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 秒的过程,所以如果有人想更进一步,请成为我的客人!

希望这可以帮助。

于 2013-01-09T11:20:48.383 回答
0

我意识到这是一个老问题,但这里的很多答案都没有给出 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可以使用任何索引。

于 2021-03-24T12:17:55.550 回答
0

我就这样解决了我的问题。感谢您提出改进建议。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 + "%'";
于 2017-02-24T01:56:37.373 回答