[英]SQL Server : store data from VB.NET
我有一个大问题。 我必须在SQL Server数据库中存储日期时间和值。
我写了一个网站,其中包含带有条目的表。
一项包含:日期,时间和值
例如:
Entry A : -> 01.01.2014 - 07.06.2014 , 00:00 - 07:15 , Value: 450 Entry A : -> 01.01.2014 - 07.06.2014 , 07:30 - 15:30 , Value: 230 Entry A : -> 01.01.2014 - 07.06.2014 , 15:45 - 23:45 , Value: 300 Entry B : -> 01.01.2014 - 07.06.2014 , 00:00 - 02:15 , Value: 130 Entry B : -> 01.01.2014 - 07.06.2014 , 02:30 - 10:45 , Value: 250 Entry B : -> 01.01.2014 - 07.06.2014 , 11:00 - 23:45 , Value: 340 Entry C ...
对于该范围内的每个日期时间,每步在15分钟内存储一个值:
例如,数据库应如下所示:
01.01.2014 00:00:00 | 450 | Entry A 01.01.2014 00:15:00 | 450 | Entry A .. .. 01.01.2014 07:15:00 | 450 | Entry A 01.01.2014 07:30:00 | 230 | Entry A 01.01.2014 07.45:00 | 230 | Entry A .. .. 01.01.2014 15:30:00 | 230 | Entry A 01.01.2014 15:45:00 | 300 | Entry A 01.01.2014 16:00:00 | 300 | Entry A .. .. 01.01.2014 23:45:00 | 300 | Entry A 01.01.2014 07:30:00 | 300 | Entry A .. .. 01.01.2014 07:15:00 | 230 | Entry A 01.01.2014 07:30:00 | 230 | Entry 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使用一个值,则效果很好。 但是在不同的时间,我不能使用它。
请帮助,我需要一个非常快速的解决方案。
我只是再次尝试了CTE。 以下代码是我的解决方案,效果很好。 现在,我只需要编写一个过程并传递参数。
谢谢大家的阅读和支持
declare @StDate datetime = '01/01/2013 00:00.000'
declare @Enddate datetime = '07/07/2043 00:00.000'
declare @stime datetime = '00:00:00'
declare @etime datetime = '23:45:00'
declare @value as int = 387
declare @id as int = 999
;with cte as
(
select DATEADD(MINUTE,DATEDIFF(Minute,0,@stime),0) as Stime
union all
select DATEADD(MINUTE,15,Stime) from cte where Stime < @etime
), cte2 as (
select DATEADD(MONTH,DATEDIFF(MONTH,0,@StDate),0) as Sdate
union all
select DATEADD(day,1,SDate) from cte2 where SDate < @Enddate
)
Insert into [dbo].[_DV_Prognose_Werte_Temp](pr_id,prognosen_Nummer,zeitstempel,[time],leistungsprognose,nvv) (select '1','1', Combined = CAST(SDate AS DATETIME) + CAST(stime AS DATETIME),stime, @value,'2' from cte cross join cte2)
OPTION (maxrecursion 0)
伪代码(对不起,我可以告诉您方法,但是我没有时间对其进行编码...)
foreach line ...
date = first date+time
enddate = second date+time
while date >= enddate
insert into db (please use Parameters)
date increment by 15 minutes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.