如何将变量连接到 SQL 中的查询中?
Posted
技术标签:
【中文标题】如何将变量连接到 SQL 中的查询中?【英文标题】:How to concatenate variables into a query in SQL? 【发布时间】:2021-11-02 01:25:48 【问题描述】:我每月从 30 个表中检索数据(每个表代表一天)。我对每个单独的表(天)使用的查询保存为存储过程,并放置在 WHILE 循环中以运行 30 天(运行查询 30 次)。我将参数 A 和 B 定义为时间间隔 3 PM 和 7 PM,因为我需要检索该时间段的数据。
下面是查询(在存储过程中),它返回的值没有问题:
SELECT det_stn_id, SUM(vol)
FROM <DBName>.<TBName>
WHERE det_stn_id IN (36)
AND userdatetime BETWEEN "2021-09-01 15:00:00" AND "2021-09-01 19:00:00"
下面是带有变量 A 和 B 的查询(在存储过程中),它不返回任何值:
set @A = SUBSTRING(@DataDate, 1, 4) + '-' + SUBSTRING(@DataDate,5, 2) + '-'
+ SUBSTRING(@DataDate, 7, 2) + ' ' + '15:00:00'
set @B = SUBSTRING(@DataDate, 1, 4) + '-' + SUBSTRING(@DataDate,5, 2) + '-' + SUBSTRING(@DataDate, 7, 2) + ' ' + '19:00:00'
print @A
print @B
SELECT det_stn_id, SUM(vol) FROM <DBName>.<TBName>
where det_stn_id in (36)
AND userdatetime BETWEEN @A AND @B'
我没有正确地将变量 A 和 B 连接到字符串中吗? (顺便说一下, print @A 和 print @B 返回我试图放入字符串“2021-09-01 15:00:00”和“2021-09-01 19:00:00”的值)
【问题讨论】:
SQL Server 和 mysql 是完全不同的产品;你真的在用什么?@A
@B
和@DataDate
的数据类型是什么?你可以只用userdatetime >= @startDate AND userdatetime < @endDatePlus1 AND CAST(userdatetime AS time) >= CAST('15:00:00' as time) AND CAST(userdatetime AS time) <= CAST('19:00:00' as time)
做一个查询(没有while
循环)
【参考方案1】:
mysql不支持+号,需要CONCAT
SET @DataDate = '20210101'
✓ ✓ | @A | | :----------------- | | 2021-01-01 15:00:00 | | @B | | :----------------- | | 2021-01-01 19:00:00 |set @A = CONCAT(SUBSTRING(@DataDate, 1, 4) , '-' , SUBSTRING(@DataDate,5, 2) , '-' , SUBSTRING(@DataDate, 7, 2) , ' ' , '15:00:00'); set @B = CONCAT(SUBSTRING(@DataDate, 1, 4) , '-' , SUBSTRING(@DataDate,5, 2) , '-' , SUBSTRING(@DataDate, 7, 2) , ' ' , '19:00:00'); SELECT @A; SELECT @B; SELECT det_stn_id, SUM(vol) FROM <DBName>.<TBName> where det_stn_id in (36) AND userdatetime BETWEEN @A AND @B'
db小提琴here
您也可以在 SQL 服务器中使用 CONCAT
CREATE TABLe TBName(det_stn_id INTEGER , vol INTEGER , userdatetime DATETIME) GO
INSERT INTO TBName VALUEs (36,1, '20210101 16:00:00'),(36,1, '20210101 12:00:00') ,(36,2, '20210101 19:00:01') GO
det_stn_id | (无列名) ---------: | ---------------: 36 | 1DECLARE @DataDate NVARCHAR(50) DECLARE @B DATETIME DECLARE @A DATETIME SET @DataDate = '20210101' set @A = CONCAT(SUBSTRING(@DataDate, 1, 4) , '-' , SUBSTRING(@DataDate,5, 2) , '-' , SUBSTRING(@DataDate, 7, 2) , ' ' , '15:00:00') set @B = CONCAT(SUBSTRING(@DataDate, 1, 4) , '-' , SUBSTRING(@DataDate,5, 2) , '-' , SUBSTRING(@DataDate, 7, 2) , ' ' , '19:00:00') SELECT det_stn_id, SUM(vol) FROM TBName where det_stn_id in (36) AND userdatetime BETWEEN @A AND @B GROUP BY det_stn_id GO
db小提琴here
【讨论】:
实际上,我使用的是 MS SQL Server Management Studio,它确实返回了值 A 和 B(当我使用“print @A”和“print @B”时,我可以看到这些值)。 我遇到的问题是当我将变量A和B放在存储过程(查询)中时,它没有返回查询结果,即下午3点到7点之间的音量总和. 问题出在这部分代码中:'''AND userdatetime BETWEEN @A AND @B'''' 请使用这个小提琴作为开始并输入一些日期dbfiddle.uk/… @Ash 做了一个小提琴,告诉你它应该可以工作以上是关于如何将变量连接到 SQL 中的查询中?的主要内容,如果未能解决你的问题,请参考以下文章
将 MIB 变量标签连接到 Prometheus 中其他两个 MIB 变量的另一个查询结果
可以将绑定变量连接到动态 SQL WHERE 子句以添加 AND 语句吗?
如何将变量传递/连接到`aws_instance`资源中的`data.aws_ami`部分
如何将 OS 环境变量连接到 Spring Web 应用程序项目中 application.properties 中的占位符?