我有一个大问题。我必须在SQL Server数据库中存储日期时间和值。
我写了一个网站,其中包含带有条目的表。
一项包含:日期,时间和值
例如:
条目A:-> 2014年1月1日-2014年7月6日,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:-> 2014年1月1日-2014年7月6日,00:00-02:15,值:130 条目B:-> 2014年1月1日-2014年7月6日,02:30-10:45,值:250 条目B:-> 2014年1月1日-2014年6月7日,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 2014年1月1日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 .. .. 2014年2月1日...
对于每个条目以及直到结束的每一天都是一样的。
我认为问题出在很多插件上。在五个月的时间里,每天每隔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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句