Moravské přístroje, a. s., zdroj: https://www.mii.cz/art?id=650&lang=405, vytištěno: 30.04.2025 14:19:22
Hlavní stránka▹Podpora▹FAQ | 1.2.2011 |
---|
Obsah sekce:
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. Poznámka: Nezapomeňte, že časový údaj je zapsán jako UTC. Pokud tedy chcete získat pásmový čas, musíte ještě od položky UTC odečíst součet hodnot ze sloupců UTC_BIAS (posunutí pásmového času vzhledem k UTC v minutách) a DST_BIAS (posunutí letního času v minutách). 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. Poznámka: Skript je psán pro MS SQL 2005 a vyšší. /*=============================================== 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 |