【发布时间】:2023-03-18 04:39:02
【问题描述】:
我有一个大问题。我必须在我的 SQL Server 数据库中存储日期时间和值。
我写了一个网站,其中包含一个带有条目的表格。
一个条目包含:日期、时间和一个值
例如:
条目 A : -> 01.01.2014 - 07.06.2014 , 00:00 - 07:15 , 值: 450 条目 A : -> 01.01.2014 - 07.06.2014 , 07:30 - 15:30 , 值: 230 条目 A : -> 01.01.2014 - 07.06.2014 , 15:45 - 23:45 , 值: 300 条目 B : -> 01.01.2014 - 07.06.2014 , 00:00 - 02:15 , 值: 130 条目 B : -> 01.01.2014 - 07.06.2014 , 02:30 - 10:45 , 值: 250 条目 B : -> 01.01.2014 - 07.06.2014 , 11:00 - 23:45 , 价值: 340 条目 C ...对于范围内的每个日期时间,每步在 15 分钟内存储一个值:
例如,数据库应如下所示:
01.01.2014 00:00:00 | 450 |条目 A 01.01.2014 00:15:00 | 450 |条目 A .. .. 01.01.2014 07:15:00 | 450 |条目 A 01.01.2014 07:30:00 | 230 |条目 A 01.01.2014 07.45:00 | 230 |条目 A .. .. 01.01.2014 15:30:00 | 230 |条目 A 01.01.2014 15:45:00 | 300 |条目 A 01.01.2014 16:00:00 | 300 |条目 A .. .. 01.01.2014 23:45:00 | 300 |条目 A 01.01.2014 07:30:00 | 300 |条目 A .. .. 01.01.2014 07:15:00 | 230 |条目 A 01.01.2014 07:30:00 | 230 |条目 A .. .. 02.01.2014 ...每个条目和每一天都一样,直到结束。
我认为问题在于插入次数过多。超过五个月,每天每 15 分钟一次,三个条目。
我写了两个脚本,都在工作。但是保存条目需要很长时间。
脚本1:我在VB中直接执行了SQL语句。
Dim cmd As DbCommand = New SqlCommand()
cmd.CommandType = Data.CommandType.Text
Temp2 = DateTime.Parse(DateStart+ " " + TimeStart)
Temp3 = DateTime.Parse(DateBegin+ " " + TimeBegin)
While (Temp2 <= Temp3)
Date = Temp2
Temp1 = Temp3
While (Temp <= Temp1)
cmd.CommandText = "INSERT INTO [dbo].[_Table_Data]([pr_id],[pr_Nr],[Date],[Value],[nvv]) VALUES (" & pr_id & "," & pr_nr & ", '" & Date & "', " & Value & " , '" & Entry &"')"
cmd.Connection = con
con.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
While (dr.Read())
' save entrys
End While
con.Close()
Temp = DateAdd(DateInterval.Minute, 15, Temp)
End While
Temp2 = DateAdd(DateInterval.Day, 1, Temp2)
End While
第二个脚本是一个 SQL 过程,我将值和日期发送到一个 SQL 过程。但没有成功,不如第一个脚本。
我也试过 CTE
;with cte as
(
select DATEADD(MONTH,DATEDIFF(MONTH,0,@StDate),0) as Sdate
union all
select DATEADD(MINUTE,15,SDate) from cte where SDate < @Enddate
)
但在这种情况下,我只有一个开始日期和一个结束日期。如果我必须将 01.01.2014 - 06.06.2014 与一个值一起使用,那效果很好。但是对于不同的时间,我不能使用它。
请帮忙,我需要一个非常快速的解决方案。
【问题讨论】:
-
不明白你到底想要什么?
-
在这种情况下,我需要发送超过 30,000 次查询,我需要弄清楚如何才能更快地保存数据。在这种情况下,网站在我存储所有数据之前超时。每天都分为不同的时间段,我必须将这些不同的时间段与每天的值一起存储。在这种情况下,从 01/01/2014 到 07/06/2014 - 00:00 到 07:15,值为 400。这意味着,每天 - 00:00 到 07:15 时钟的值为 400。其余时间time Periode ( 07:30 - 15:30 ) 和 ( 15:45 - 23:45 ) 还有一个值。
-
一步一步把所有的数据存储起来需要很长时间。网站超时。 :(
-
哪一点很慢 - 你有没有分析过它?此外,您的 SQL Server 是本地的还是远程的(即网络延迟是一个问题);你有任何聚集索引吗?
-
另外你为什么要在
INSERT命令上尝试ExecuteReaderr?我通常希望你ExecuteNonQuery,因为插入(如所写)不会向客户端返回任何行
标签: sql sql-server vb.net stored-procedures common-table-expression