| 
  
  
    
      
      
      
        
         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
          
        
      
    
  
 |