在SQL Server上的BETWEEN查询中,v1和v2的顺序是否有差异?
SELECT *
FROM table
WHERE col BETWEEN v1 AND v2
Run Code Online (Sandbox Code Playgroud)
如果v1大于v2,目前我没有得到任何结果.这只是语法糖吗?
col >= v1 AND col <= v2
Run Code Online (Sandbox Code Playgroud)
或者它真的取两者之间的所有价值?根据我目前的观察,我猜这是第一种情况.
我有一个表,每行包含一个日期和一些任意的数值.我需要将此值与特定但动态的日期间隔相加.
SELECT VERSION();
5.0.51a-24+lenny5
CREATE TABLE IF NOT EXISTS `work_entries` (
`entry_id` int(10) unsigned NOT NULL auto_increment,
`employee_id` tinyint(3) unsigned NOT NULL,
`work_date` date NOT NULL,
`hour_count` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`entry_id`)
);
INSERT INTO `work_entries` (`entry_id`, `employee_id`, `work_date`, `hour_count`) VALUES
(1, 1, '2011-04-25', 2),
(2, 1, '2011-04-26', 3),
(3, 1, '2011-04-27', 1),
(4, 2, '2011-04-25', 2),
(5, 2, '2011-04-27', 4),
(6, 1, '2011-05-08', 2),
(7, 2, '2011-05-06', 8),
(8, 2, '2011-05-08', 9),
(9, 2, '2011-05-09', 1),
(10, …Run Code Online (Sandbox Code Playgroud) 我通常必须查询一个非常大的表,查找每个变量有多个条件的多个变量.通常,需要在多个范围内查询变量.例如,我可能需要VAR_1的所有记录,其中VAR_1在200-300,350-400,450-500之间.
通常我会写如下,但有人告诉我使用IN()而不是多个OR会更有效率.
SELECT * FROM table
WHERE VAR_1 BETWEEN '200' AND '300' OR
VAR_1 BETWEEN '350' AND '400' OR
VAR_1 BETWEEN '450' AND '500'
Run Code Online (Sandbox Code Playgroud)
有没有办法压缩这些信息,并OR通过嵌套LIKE或BETWEEN条款摆脱s IN()?有点像:
WHERE VAR_1 IN (BETWEEN '200' AND '300', BETWEEN '350' AND '400', BETWEEN '450' AND '500')
要么
WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')
我尝试过这样的东西,但语法显然不正确.您可以指出我的任何想法或方向都很棒,对SQL来说仍然是新手.
我存储我列server_date_time日期中varchar的dd/mm/yyyy格式,我想,所以我必须使用的查询来获取一些日期之间躺在记录
select * from activity_emp
where date_format(str_to_date(substr(server_date_time,1,10),'%d/%m/%Y'),'%d/%m/%Y')>=
'29/09/2012'
and date_format(str_to_date(substr(server_date_time,1,10),'%d/%m/%Y'),'%d/%m/%Y')<=
'07/10/2012';
Run Code Online (Sandbox Code Playgroud)
我已varchar在查询中转换为字符串,但我的查询返回的查询数据仅与29/09/2012和30/09/2012相关.它还应该返回10月份的查询
我有一个oracle SQL查询,它选择当天的条目,如下所示:
SELECT [fields]
FROM MY_TABLE T
WHERE T.EVT_END BETWEEN TRUNC(SYSDATE)
AND TRUNC(SYSDATE) + 86399/86400
AND T.TYPE = 123
Run Code Online (Sandbox Code Playgroud)
而该EVT_END领域是类型的DATE,T.TYPE是一个NUMBER(15,0).
我确信随着表数据(和持续时间)的大小增加,日期约束将使结果集减少比类型约束大得多的因子.(因为类型非常有限)
所以出现的基本问题是,选择在当前日期选择更快的最佳指标是什么.我特别想知道函数索引对TRUNC(T.EVT_END)正常索引的优缺点是什么T.EVT_END.使用功能索引时,查询看起来像这样:
SELECT [fields]
FROM MY_TABLE T
WHERE TRUNC(T.EVT_END) = TRUNC(SYSDATE)
AND T.TYPE = 123
Run Code Online (Sandbox Code Playgroud)
因为其他查询使用提到的日期约束而没有额外的类型选择(或者可能包含其他一些字段),因此多列索引对我没有多大帮助.
谢谢,我很感激你的提示.
我正在尝试使用TSQL传递两个10位数的电话号码块.
让我们说:
TelephoneNumber1: 1234560095
TelephoneNumber2: 1234561005
Run Code Online (Sandbox Code Playgroud)
我的表由3列组成:
ID, StartBlock, EndBlock
1, 5671231000, 5671232000
2, 1234561000, 1234562000
3, 2175551200, 2175551300
Run Code Online (Sandbox Code Playgroud)
所以我要做的是找到之间的所有数字TelephoneNumber1,TelephoneNumber2并查看它之间StartBlock和EndBlock表中的任何记录之间是否存在.
在这个例子中,它会在第二个记录中找到一个已经在使用的数字,因为当它1234560095到达时1234561000,它会在已经在使用中找到它.
如何完成此操作以查找StartBlock和EndBlock之间正在使用的数字?
我有一个查询,其中where条件如下:
WHERE A.event_date BETWEEN B.start_date AND B.end_date
Run Code Online (Sandbox Code Playgroud)
复杂性是,如果B.start_date是NULL,则意味着从远古时代开始,同样B.end_date是NULL,它意味着现在.所以,我还是要选择一排,其中A.event_date > B.start_date和B.end_date是NULL,例如.
这种冗长的方式是
WHERE A.event_date BETWEEN B.start_date AND B.end_date
OR (A.event_date > B.start_date AND B.end_date IS NULL)
OR (B.start_date IS NULL AND A.event_date < B.end_date)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的解决方案(特别是因为在一个查询中我有多个这样的条件)
几周前,我做了一个查询(不记得要做什么),它涉及到BETWEEN运算符。刚开始,我在WHERE子句中使用了它,但是它没有产生正确的结果集(再次,我不记得问题出在哪里)。我考虑了为什么,最后得出结论,我不得不将其移至该JOIN条款。
例如
“原始”查询:
SELECT --something
FROM table1 a
/*type of*/ JOIN table2 b ON a.field = b.field
WHERE b.field2 BETWEEN a.field2 AND a.field3 /*some other conditions*/
Run Code Online (Sandbox Code Playgroud)
修改后的查询:
SELECT --something
FROM table1 a
/*type of*/ JOIN table2 b ON a.field = b.field
AND b.field2 BETWEEN a.field2 AND a.field3
WHERE /*some other conditions*/
Run Code Online (Sandbox Code Playgroud)
与JOIN版本相比,该版本返回的结果集较小WHERE,并且该JOIN版本产生了正确的结果集,而WHERE没有。
我现在要问的原因是因为当时我什么都没想到,但是今天老板问我为什么要这样做(针对完全不同的查询),我告诉他我上次做过的经历,两者他和我对这两种用法之间的差异很感兴趣。
从我的观点来看,为什么一个版本产生与另一个WHERE版本不同的原因是,子句版本仅选择了一系列数据,而该JOIN版本则寻找了一系列要连接的数据。是这样吗 或者,我确实遇到了受其余查询影响的独特体验(查询比示例复杂得多)。
编辑
我不同意可能的重复内容,因为我的内容专门针对该BETWEEN …
我在我的项目中使用jooq,我需要在两个日期之间查询一些数据.
生成正确数据的sql查询是
select created_on from queue_token where created_on between '2015-07-16' and '2015-07-17' and token_queue_id=1;
Run Code Online (Sandbox Code Playgroud)
我写的等效jooq查询在下面,但没有给出所需的结果
create.select().from(com.database.tables.QueueToken.QUEUE_TOKEN)
.where(com.database.tables.QueueToken.QUEUE_TOKEN.TOKEN_QUEUE_ID.equal(1))
.and(com.database.tables.QueueToken.QUEUE_TOKEN.CREATED_ON.between(new Timestamp(fromDate.getTime())).and(new Timestamp(toDate.getTime())))
.fetch();
Run Code Online (Sandbox Code Playgroud)
jooq查询生成结果,但只生成与fromDate完全匹配的记录.所以基本上它不适用于日期范围.
有人可以帮忙吗?
这是我的代码:
DECLARE @d1 DATETIME
DECLARE @d2 DATETIME
SET @d1 = '2015-01-01 00:00:00'
SET @d2 = '2015-12-31 23:59:59.999'
SELECT
CASE
WHEN ('2016-01-01 00:00:00' BETWEEN @d1 AND @d2)
THEN 'is between'
ELSE 'not between'
END AS BetweenOrNotBetween
Run Code Online (Sandbox Code Playgroud)
我在这里提供的日期比函数的范围晚 1毫秒BETWEEN,但在我的SQL 2008服务器实例上,结果是'介于'之间而不是预期的'不介于'之间 ...
这是一个错误,还是由于某些我没有看到的原因而在设计中是必要的妥协?
是的,只要我在2016-01-01午夜之后加上一小段时间,我就会得到预期的'不在'之间的结果.