add - 振动传感器整点数据存储过程、定时删除历史数据

master
yinq 1 day ago
parent c061e679ad
commit e0eebd89a9

@ -0,0 +1,238 @@
/*
1. dbo.sp_InsertVibrationSensorHourlyReport
sensor_id T_VibrationSensor_Data collectTime objId
2. reportTime 2025-03-23 09:00:00 [09:00, 10:00)
3. 使 SQL Server Quartz
-
- [DATEADD(hour,-1,@EndExclusive), @EndExclusive)
*/
IF OBJECT_ID(N'dbo.T_VibrationSensor_Hourly_Report', N'U') IS NULL
BEGIN
CREATE TABLE dbo.T_VibrationSensor_Hourly_Report
(
objId BIGINT IDENTITY
CONSTRAINT PK_T_VibrationSensor_Hourly_Report PRIMARY KEY,
reportTime DATETIME NOT NULL,
sensor_id NVARCHAR(64) NOT NULL,
collectTime DATETIME NULL,
speed DECIMAL(18, 2) NULL,
displacement DECIMAL(18, 2) NULL,
acceleration DECIMAL(18, 2) NULL,
temperature DECIMAL(18, 2) NULL,
recodeTime DATETIME NOT NULL CONSTRAINT DF_T_VibrationSensor_Hourly_Report_recodeTime DEFAULT GETDATE(),
remark VARCHAR(64) NULL,
CONSTRAINT UQ_T_VibrationSensor_Hourly_Report_hour_sensor UNIQUE (reportTime, sensor_id)
);
CREATE NONCLUSTERED INDEX IX_T_VibrationSensor_Hourly_Report_reportTime
ON dbo.T_VibrationSensor_Hourly_Report (reportTime DESC);
EXEC sp_addextendedproperty N'MS_Description', N'振动传感器整点报表(每小时末条采集)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report';
EXEC sp_addextendedproperty N'MS_Description', N'主键', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'objId';
EXEC sp_addextendedproperty N'MS_Description', N'报表归属小时(该小时起点)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'reportTime';
EXEC sp_addextendedproperty N'MS_Description', N'振动传感器ID', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'sensor_id';
EXEC sp_addextendedproperty N'MS_Description', N'该小时内末条记录的采集时间', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'collectTime';
EXEC sp_addextendedproperty N'MS_Description', N'速度(mm/s)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'speed';
EXEC sp_addextendedproperty N'MS_Description', N'位移(um)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'displacement';
EXEC sp_addextendedproperty N'MS_Description', N'加速度(g)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'acceleration';
EXEC sp_addextendedproperty N'MS_Description', N'温度(℃)', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'temperature';
EXEC sp_addextendedproperty N'MS_Description', N'写入报表时间', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'recodeTime';
EXEC sp_addextendedproperty N'MS_Description', N'备注', N'SCHEMA', N'dbo', N'TABLE', N'T_VibrationSensor_Hourly_Report', N'COLUMN', N'remark';
END
GO
IF OBJECT_ID(N'dbo.sp_InsertVibrationSensorHourlyReport', N'P') IS NOT NULL
DROP PROCEDURE dbo.sp_InsertVibrationSensorHourlyReport;
GO
CREATE PROCEDURE dbo.sp_InsertVibrationSensorHourlyReport
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @EndExclusive DATETIME = DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()), 0);
DECLARE @StartInclusive DATETIME = DATEADD(HOUR, -1, @EndExclusive);
DECLARE @ReportTime DATETIME = @StartInclusive;
;WITH Ranked AS (
SELECT d.objId,
d.sensor_id,
d.collectTime,
d.speed,
d.displacement,
d.acceleration,
d.temperature,
d.remark,
ROW_NUMBER() OVER (
PARTITION BY d.sensor_id
ORDER BY d.collectTime DESC, d.objId DESC
) AS rn
FROM dbo.T_VibrationSensor_Data d
WHERE d.collectTime >= @StartInclusive
AND d.collectTime < @EndExclusive
)
INSERT INTO dbo.T_VibrationSensor_Hourly_Report (reportTime, sensor_id, collectTime, speed, displacement,
acceleration, temperature, recodeTime, remark)
SELECT @ReportTime,
r.sensor_id,
@ReportTime,
r.speed,
r.displacement,
r.acceleration,
r.temperature,
@ReportTime,
r.remark
FROM Ranked r
WHERE r.rn = 1
AND NOT EXISTS (
SELECT 1
FROM dbo.T_VibrationSensor_Hourly_Report x
WHERE x.reportTime = @ReportTime
AND x.sensor_id = r.sensor_id
);
-- 清理原始明细:删除 recodeTime 三个月前的数据
DELETE FROM dbo.T_VibrationSensor_Data
WHERE recodeTime < DATEADD(MONTH, -3, @EndExclusive);
END
GO
IF NOT EXISTS (
SELECT 1
FROM sys.extended_properties ep
WHERE ep.class = 1
AND ep.major_id = OBJECT_ID(N'dbo.sp_InsertVibrationSensorHourlyReport')
AND ep.minor_id = 0
AND ep.name = N'MS_Description'
)
EXEC sp_addextendedproperty N'MS_Description',
N'按小时汇总振动温度:无入参,固定按当前整点回算上一小时,取各传感器 collectTime 最后一条写入整点报表。',
N'SCHEMA', N'dbo', N'PROCEDURE', N'sp_InsertVibrationSensorHourlyReport';
ELSE
EXEC sp_updateextendedproperty N'MS_Description',
N'按小时汇总振动温度:无入参,固定按当前整点回算上一小时,取各传感器 collectTime 最后一条写入整点报表。',
N'SCHEMA', N'dbo', N'PROCEDURE', N'sp_InsertVibrationSensorHourlyReport';
GO
/*
--------------------------------------------------------------------
menu_id / parent_id
-- 目录或菜单 Curl = /system/TVibrationSensorHourlyReport
-- perms: system:TVibrationSensorHourlyReport:view / list / export
INSERT INTO sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, remark)
VALUES (N'振动整点报表', <ID>, 10, N'/system/TVibrationSensorHourlyReport', N'C', N'0', N'system:TVibrationSensorHourlyReport:view', N'fa fa-table', N'admin', GETDATE(), N'');
-- 将返回的 menu_id 记入 @mid再插入按钮权限 F
-- system:TVibrationSensorHourlyReport:list
-- system:TVibrationSensorHourlyReport:export
--------------------------------------------------------------------
*/
/*
--------------------------------------------------------------------
SQL Server SSMS
USE msdb;
GO
EXEC dbo.sp_add_job
@job_name = N'振动传感器整点报表',
@enabled = 1,
@description = N'每小时执行 sp_InsertVibrationSensorHourlyReport';
GO
EXEC dbo.sp_add_jobstep
@job_name = N'振动传感器整点报表',
@step_name = N'写入整点报表',
@subsystem = N'TSQL',
@database_name = N'你的数据库名',
@command = N'EXEC dbo.sp_InsertVibrationSensorHourlyReport;',
@retry_attempts = 2,
@retry_interval = 5;
GO
EXEC dbo.sp_add_schedule
@schedule_name = N'每小时整点',
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 8,
@freq_subday_interval = 1,
@active_start_time = 0;
GO
EXEC dbo.sp_attach_schedule
@job_name = N'振动传感器整点报表',
@schedule_name = N'每小时整点';
GO
EXEC dbo.sp_add_jobserver
@job_name = N'振动传感器整点报表';
GO
@active_start_time = 0 00:00:00 1 freq_subday
SSMS EXEC
--------------------------------------------------------------------
*/
/*
--------------------------------------------------------------------
1) 00:00 ~ 2 1
2) reportTime + sensor_id
--------------------------------------------------------------------
*/
DECLARE @TodayStart DATETIME = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0);
DECLARE @CurrentHour DATETIME = DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()), 0);
;WITH H AS (
SELECT @TodayStart AS reportTime
UNION ALL
SELECT DATEADD(HOUR, 1, reportTime)
FROM H
WHERE DATEADD(HOUR, 1, reportTime) < @CurrentHour
),
S AS (
SELECT N'VS-001' AS sensor_id
UNION ALL
SELECT N'VS-002'
),
R AS (
SELECT
h.reportTime,
s.sensor_id,
h.reportTime AS collectTime,
CAST((ABS(CHECKSUM(NEWID())) % 1200) / 100.0 AS DECIMAL(18, 2)) AS speed,
CAST((ABS(CHECKSUM(NEWID())) % 5000) / 100.0 AS DECIMAL(18, 2)) AS displacement,
CAST((ABS(CHECKSUM(NEWID())) % 300) / 100.0 AS DECIMAL(18, 2)) AS acceleration,
CAST((ABS(CHECKSUM(NEWID())) % 7000) / 100.0 AS DECIMAL(18, 2)) AS temperature
FROM H h
CROSS JOIN S s
)
INSERT INTO dbo.T_VibrationSensor_Hourly_Report
(
reportTime, sensor_id, collectTime, speed, displacement, acceleration, temperature, recodeTime, remark
)
SELECT
r.reportTime,
r.sensor_id,
r.collectTime,
r.speed,
r.displacement,
r.acceleration,
r.temperature,
r.reportTime,
N'随机测试数据'
FROM R r
WHERE NOT EXISTS (
SELECT 1
FROM dbo.T_VibrationSensor_Hourly_Report x
WHERE x.reportTime = r.reportTime
AND x.sensor_id = r.sensor_id
)
OPTION (MAXRECURSION 1000);
GO
Loading…
Cancel
Save