Obsah sekce: - Jak zobrazit UTC z archivních souborů jako formátovaný datum
a čas?
- Export dat z databáze do textového souboru (csv)
- SQL skript pro nastavení neukončených alarmů v tabulce
alarmů do stavu ukončených alarmů
Jak zobrazit UTC z archivních souborů jako formátovaný datum
a čas?
SQL příkaz pro převod Juliánského data z položky UTC
v archivních tabulkách do podoby formátovaného data a
času.
V databázových tabulkách vytvářených sekcemi archive a alarm je
čas záznamu zapisován jako Juliánské datum doplněné o zlomek
časového kroku (údaj za dvojtečkou). Pro zobrazování je ale určitě
přehlednější používat formátovaný datum a čas podle národních
zvyklostí. Následující SQL příkaz demonstruje, jak převést
Juliánské datum do formátované podoby. Syntax T-SQL (MS SQL
Server)
SELECT UTC, CAST((CAST(LEFT(UTC, 16) AS FLOAT) - 2415020.5) AS DATETIME) AS MyDate FROM Table
Syntax pro MDB databázi (MS Access)
SELECT UTC, CDate(CDbl(Left(UTC,7) & ',' & Mid(UTC,9,8)) - 2415018.5) AS MyDate FROM Table
Výsledkem tohoto dotazu bude tedy tabulka, která bude v prvním
sloupci zobrazovat původní podobu Juliánského data a ve druhém
sloupci formátovaný datum a čas.
Pokud tedy bude chtít získat pásmový čas záznamu, budou dotazy
vypadat takto: Syntax T-SQL (MS SQL Server)
SELECT UTC, CAST((CAST(LEFT(UTC, 16) AS FLOAT) - (UTC_BIAS + DST_BIAS)/1440.0 - 2415020.5) AS DATETIME) AS MyDate FROM Table
Syntax pro MDB databázi (MS Access)
SELECT UTC, CDate(CDbl(Left(UTC,7) & ',' & Mid(UTC,9,8)) - (UTC_BIAS + DST_BIAS)/1440.0 - 2415018.5) AS MyDate FROM Table
Export dat z databáze do textového souboru (csv)
Příklad ukazuje export dat z databáze získaných SQL
dotazem do textového souboru. Soubor s příponou CSV lze
načíst přímo do tabulkového kalkulátoru Excel.
Předpokládejme existenci přístroje sql
s názvem sql a přístroje file
s názvem f.
procedure Export( Query, Path, Separator : string; FHeader : boolean );
const
r = 'rs';
var
c : cardinal;
s : string;
line : string;
header : string;
ok, null : boolean;
begin
if sql.OpenRecordset( r, Query ) then
ok = f.Create( Path );
if FHeader then
sql.ShowRecordset( r );
end;
ok = sql.MoveToFirstRecord( r );
while ok do
(* Read current record's data *)
c = 1;
line = '';
while sql.GetData( r, c, s, null ) do
line = line + iif( c > 1, Separator, '' ) + s;
if FHeader then
ok = sql.GetColumnProperty( c, 'name', s );
header = header + iif( c > 1, Separator, '' ) + s;
end; (* if *)
c = c + 1;
end; (* while *)
(* Write columns header to target file *)
if FHeader then
f.WrStr( header ); f.WrLn();
FHeader = false;
end; (* if *)
(* Write current record to target file *)
f.WrStr( line ); f.WrLn();
ok = sql.MoveToNextRecord( r );
end; (* while *)
f.Close();
sql.CloseRecordset( r );
end; (* if *)
end_procedure;
Download: ExportDatabaseDataToCSVFile.zip
SQL skript pro nastavení neukončených alarmů v tabulce
alarmů do stavu ukončených alarmů
Pokud potřebujete nastavit v tabulce alarmů neukončené
alarmy do stavu ukončených alarmů, můžete použít následující
skript.
Před spuštěním skriptu nastavte jméno tabulky alarmů,
zapisované hodnoty datových elementů a jméno operátora do
parametrů @Alarms, @F_VALUE_N, @F_VALUE_B,
@F_VALUE_S a SET @F_OPERATOR.
/*===============================================
Zjištění období, kdy platí letní čas
==============================================*/
DECLARE @DSTStart DATETIME
DECLARE @DSTEnd DATETIME
-- Začátek DST
DECLARE @DSTStartWeek SMALLDATETIME
SET @DSTStartWeek = '03/01/' + Convert(VARCHAR,Year(Getutcdate()))
SELECT @DSTStart =
CASE Datepart(dw,@DSTStartWeek)
WHEN 1 THEN Dateadd(HOUR, 170, @DSTStartWeek)
WHEN 2 THEN Dateadd(HOUR, 314, @DSTStartWeek)
WHEN 3 THEN Dateadd(HOUR, 290, @DSTStartWeek)
WHEN 4 THEN Dateadd(HOUR, 266, @DSTStartWeek)
WHEN 5 THEN Dateadd(HOUR, 242, @DSTStartWeek)
WHEN 6 THEN Dateadd(HOUR, 218, @DSTStartWeek)
WHEN 7 THEN Dateadd(HOUR, 194, @DSTStartWeek)
END
-- Konec DST
DECLARE @DSTEndWeek SMALLDATETIME
SET @DSTEndWeek = '11/01/' + Convert(VARCHAR,Year(Getutcdate()))
SELECT @DSTEnd =
CASE Datepart(dw, Dateadd(WEEK, 1, @DSTEndWeek))
WHEN 1 THEN Dateadd(HOUR, 2, @DSTEndWeek)
WHEN 2 THEN Dateadd(HOUR, 146, @DSTEndWeek)
WHEN 3 THEN Dateadd(HOUR, 122, @DSTEndWeek)
WHEN 4 THEN Dateadd(HOUR, 98, @DSTEndWeek)
WHEN 5 THEN Dateadd(HOUR, 74, @DSTEndWeek)
WHEN 6 THEN Dateadd(HOUR, 50, @DSTEndWeek)
WHEN 7 THEN Dateadd(HOUR, 26, @DSTEndWeek)
END
/*===============================================
Ukončení alarmů
===============================================*/
DECLARE @Alarms AS VARCHAR(128)
DECLARE @F_VALUE_N AS FLOAT
DECLARE @F_VALUE_B AS BIT
DECLARE @F_VALUE_S AS VARCHAR(255)
DECLARE @F_OPERATOR AS VARCHAR(255)
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @Params NVARCHAR(MAX);
/***********************************************
Nastavení parametrů:
- jméno tabulky alarmů
- zapisované hodnoty
- jméno operátora
***********************************************/
SET @Alarms = 'alAlarms' -- Tabulka alarmů
SET @F_VALUE_N = 0 -- Numerické hodnoty
SET @F_VALUE_B = 0 -- Logické hodnoty
SET @F_VALUE_S = '' -- Textové hodnoty
SET @F_OPERATOR = NULL -- Jméno operátora
SET @Params = '@DSTStart DATETIME, @DSTEnd DATETIME, @F_VALUE_N FLOAT, @F_VALUE_B BIT, @F_VALUE_S VARCHAR(255), @F_OPERATOR VARCHAR(255)'
SET @sql =
N'UPDATE a SET
a.FINISHED = 2,
a.F_UTC = Str(CAST(Getutcdate() AS float) + 2415020.5, 16, 8) + '':'' + RIGHT( ''0000000'' + LTRIM((STR(r.RN,8,0))), 8),
a.F_UTC_BIAS = a.S_UTC_BIAS,
a.F_DST_BIAS = CASE WHEN Getutcdate() BETWEEN @DSTStart AND @DSTEnd THEN -60 ELSE 0 END,
a.F_VALUE_N = CASE WHEN a.VALUE_TYPE = 1 THEN @F_VALUE_N ELSE a.F_VALUE_N END,
a.F_VALUE_B = CASE WHEN a.VALUE_TYPE = 2 THEN @F_VALUE_B ELSE a.F_VALUE_B END,
a.F_VALUE_S = CASE WHEN a.VALUE_TYPE = 3 THEN @F_VALUE_S ELSE a.F_VALUE_S END,
a.F_OPERATOR = @F_OPERATOR
FROM ' + @Alarms + ' a INNER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY S_UTC ASC) AS RN, S_UTC FROM ' + @Alarms + ' WHERE FINISHED = 0) r ON a.S_UTC = r.S_UTC
WHERE FINISHED = 0'
EXEC sp_executesql @sql, @Params, @DSTStart = @DSTStart, @DSTEnd = @DSTEnd, @F_VALUE_N = @F_VALUE_N, @F_VALUE_B = @F_VALUE_B, @F_VALUE_S = @F_VALUE_S, @F_OPERATOR = @F_OPERATOR
|