如何在Entity Framework中使用BETWEEN关键字?
这是我的SQL查询
SELECT *
FROM [HRM].[dbo].[meals]
WHERE SHIFTCODE = 'Normal'
AND 12.59 BETWEEN [STAR TIME] AND [STAR TIME]+DURATION/10;
Run Code Online (Sandbox Code Playgroud)
这是我的实体框架代码.
HRMEntities HRM = new HRMEntities();
meal ml = HRM.meals.SingleOrDefault(p => p.SHIFTCODE == "Normal");
Run Code Online (Sandbox Code Playgroud)
值12.59可以是变量
我正在使用PostgreSQL(9.2.0)并拥有一个IP范围表.这是SQL:
CREATE TABLE ips
(
id serial NOT NULL,
begin_ip_num bigint,
end_ip_num bigint,
country_name character varying(255),
CONSTRAINT ips_pkey PRIMARY KEY (id )
)
Run Code Online (Sandbox Code Playgroud)
我已经添加了两个指数begin_ip_num和end_ip_num:
CREATE INDEX index_ips_on_begin_ip_num
ON ips
USING btree
(begin_ip_num );
CREATE INDEX index_ips_on_end_ip_num
ON ips
USING btree
(end_ip_num );
Run Code Online (Sandbox Code Playgroud)
使用的查询是:
SELECT "ips".* FROM "ips" WHERE (3065106743 BETWEEN begin_ip_num AND end_ip_num);
Run Code Online (Sandbox Code Playgroud)
问题是我的BETWEEN查询只使用索引begin_ip_num.使用索引后,它会使用过滤结果end_ip_num.这是EXPLAIN ANALYZE结果:
Index Scan using index_ips_on_begin_ip_num on ips (cost=0.00..2173.83 rows=27136 width=76) (actual time=16.349..16.350 rows=1 loops=1) …Run Code Online (Sandbox Code Playgroud) 我只是发现mysql可以使用如下方式查询datetime:
like '2013-06-12%'
Run Code Online (Sandbox Code Playgroud)
我认为它不能使用索引.我谷歌,但直接找不到这样的主题.所以我使用3308614记录的表进行了测试.第一个SQL:
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
Run Code Online (Sandbox Code Playgroud)
我们都知道这个SQL不能使用索引,需要4秒才能得到结果.第二个SQL:
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Run Code Online (Sandbox Code Playgroud)
我不知道它是否可以使用索引,但它也需要4秒.第三个SQL:
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
Run Code Online (Sandbox Code Playgroud)
我们都知道第三个SQL可以使用索引,它需要0.016秒.
所以我认为'like'在查询datetime字段时不能使用索引,因为mysql应该首先将datetime字段转换为字符串并将字符串发送到like命令.它是否正确 ?
我在SQL Server 2000中使用T-SQL,我有一个表TRANSACTIONS,其日期列TRANDATE定义为DateTime,以及与此问题无关的许多其他列.
该表填充了多年的交易.我遇到了代码,测试,让我困惑.有一个简单的SELECT,像这样:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010' and '12/31/2010' ORDER BY TRANDATE
Run Code Online (Sandbox Code Playgroud)
并且它不返回我知道在该表中的两行数据.
通过上面的语句,它返回的最后一行按顺序TRANDATE为:2010-12-31 00:00:00.000
当我修改如下所示的语句时,我获得了该表中2010年12月的额外两行:
SELECT TRANDATE, RECEIPTNUMBER FROM TRANSACTIONS WHERE TRANDATE BETWEEN '12/01/2010 00:00:00' and '12/31/2010 23:59:59' ORDER BY TRANDATE
Run Code Online (Sandbox Code Playgroud)
我试图找出为什么BETWEEN运营商在12/31/2010使用第一个SELECT,上面的24个时期内不包括所有行.为什么它需要将明确的小时数添加到SELECT语句中,如第二个修改后的语句中所示,以使其拉出正确的行数?
是因为这种方式TRANDATE被定义为" DATETIME"?
基于这个发现,我认为我将不得不经历所有这些旧代码,因为这些BETWEEN操作符遍布这个旧系统,似乎并没有正确地提取所有数据.我只想先从一些人那里得到澄清.谢谢!
我正在尝试将两个相对简单的表连接在一起,但我的查询遇到了严重的挂断.我不确定为什么,但我认为它可能与'between'功能有关.我的第一个表看起来像这样(有很多其他列,但这将是我拉的唯一列):
RowNumber
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)
我的第二个表"将"行"分组"为"块",并具有以下架构:
BlockID RowNumberStart RowNumberStop
1 1 3
2 4 7
3 8 8
Run Code Online (Sandbox Code Playgroud)
我想要的结果是将RowNumber与BlockID链接如下,与第一个表的行数相同.所以结果看起来像这样:
RowNumber BlockID
1 1
2 1
3 1
4 2
5 2
6 2
7 2
8 3
Run Code Online (Sandbox Code Playgroud)
为了得到它,我使用了以下查询,将结果写入临时表:
select A.RowNumber, B.BlockID
into TEMP_TABLE
from TABLE_1 A left join TABLE_2 B
on A.RowNumber between B.RowNumberStart and B.RowNumberStop
Run Code Online (Sandbox Code Playgroud)
TABLE_1和TABLE_2实际上是非常大的表.表1大约是122M行,而TABLE_2大约是65M行.在TABLE_1中,RowNumber被定义为'bigint',而在TABLE_2中,BlockID,RowNumberStart和RowNumberStop都被定义为'int'.不确定是否有所作为,但也只是想包含这些信息.
该查询现已挂了八个小时.对这种类型和数据量的类似查询不会花费这么长时间.所以我想知道它是否可能是挂起此查询的'之间'声明.
绝对欢迎任何有关如何提高效率的建议.
.recyclerView 和 recyclerListView 的区别。recyclerListView 是 ListView 吗??或者两者都一样?
我看到我的开发人员使用这种结构来选择所选日期间隔的数据:
SELECT ... WHERE `date` >= '2011-11-28' AND `date` <= '2011-12-04'
Run Code Online (Sandbox Code Playgroud)
我建议他使用BETWEEN像这样的运算符:
SELECT ... WHERE date BETWEEN '2011-11-28' AND '2011-12-04'
Run Code Online (Sandbox Code Playgroud)
哪种解决方案更好,有什么参数?
我有一个存储过程,希望检查日期是在固定日期和当前日期/时间之间(带GETDATE()):
SELECT
a, b
FROM myTbl
WHERE
DATE BETWEEN 'Day start datetime' AND GETDATE()
Run Code Online (Sandbox Code Playgroud)
...例如 :
WHERE
DATE BETWEEN '2013-09-10 00:00:00.00' AND 'GETDATE()'
Run Code Online (Sandbox Code Playgroud)
怎么做?
explain
SELECT COUNT(*) AS Count, CreatedBy
FROM `Notes`
INNER JOIN Users ON UserID = CreatedBy
INNER JOIN UserRoles ON URoleID = RoleID AND RoleID = 1
WHERE NoteVisible = 1 AND NoteText NOT LIKE '%SOME KEYWORD%'
AND Created BETWEEN '2014-02-24 00:00:00' AND '2014-02-24 23:59:59'
GROUP BY CreatedBy
Run Code Online (Sandbox Code Playgroud)

如您所见,ref为NULL并且经过23行而不是仅通过1行.现在对于这个例子来说这很快但是当我做1-2个月的范围时,行变为> 10000并且它减慢了页面的速度并且锁定了表格.
注意如果我删除00:00:00和23:59:59然后它使用索引它只通过1行但我需要选择从00:00开始到23:59结束的整天的所有数据.
请帮我重构此查询以解决此问题或建议任何可能的解决方案.谢谢.
编辑
用<或>或<=或>替换BETWEEN不能解决问题
我对此查询有疑问:
SELECT *
FROM runs
WHERE (NOW() BETWEEN began_at
AND finished_at)
Run Code Online (Sandbox Code Playgroud)
你认为为beginning_at和finished_at列创建复合索引是否有意义?或者只为starts_at创建索引是有意义的?
between ×10
mysql ×4
indexing ×2
sql ×2
sql-server ×2
t-sql ×2
c# ×1
composite ×1
datetime ×1
difference ×1
performance ×1
postgresql ×1
sql-like ×1