如何将变量连接到 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 &gt;= @startDate AND userdatetime &lt; @endDatePlus1 AND CAST(userdatetime AS time) &gt;= CAST('15:00:00' as time) AND CAST(userdatetime AS time) &lt;= CAST('19:00:00' as time)做一个查询(没有while循环) 【参考方案1】:

mysql不支持+号,需要CONCAT

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 @A;
SELECT @B;

SELECT det_stn_id, SUM(vol) FROM <DBName>.<TBName>
 where det_stn_id in (36)
 AND userdatetime BETWEEN @A AND @B'
✓ ✓ | @A | | :----------------- | | 2021-01-01 15:00:00 | | @B | | :----------------- | | 2021-01-01 19:00:00 |

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
DECLARE @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
det_stn_id | (无列名) ---------: | ---------------: 36 | 1

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 中的查询中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将会话变量连接到 Django 中的登录用户?

将 MIB 变量标签连接到 Prometheus 中其他两个 MIB 变量的另一个查询结果

可以将绑定变量连接到动态 SQL WHERE 子句以添加 AND 语句吗?

如何将变量传递/连接到`aws_instance`资源中的`data.aws_ami`部分

如何将 OS 环境变量连接到 Spring Web 应用程序项目中 application.properties 中的占位符?

将另一个变量粘贴到我在 R 中的 SQL 查询中