Thread SQL-Datum mit Perl-Datum subtrahieren (DB2) (3 answers)
Opened by Hoppii at 2015-04-09 17:08

GwenDragon
 2015-04-09 18:27
#180615 #180615
User since
2005-01-17
14538 Artikel
Admin1
[Homepage]
user image
Leider ist TIMESTAMPDIFF von DB2 nicht akkurat genug.

Deswegen muss du eine Funktion epoch (wandelt deinen DB2-timestamp in unixtimestamp) in DB2-SQL selbst erstellen:
Code: (dl )
1
2
3
4
5
6
create or replace function epoch (in db2ts timestamp)
returns bigint
language sql
deterministic
no external action
return (days(db2ts - current timezone) - days('1970-01-01-00.00.00.000000')) * 86400 + midnight_seconds(db2ts - current timezone);
http://stackoverflow.com/questions/7677529/db2-tim...

1. SQL ausdenken um mit epoch den ersten Timestamp zu holen (dein SELECT halt)
2. in Perl mit DBI und CPAN:DBD::DB2 das SQL ausführen und den Wert auslesen
2. in Perl mit +time() (=aktueller Timestamp) vergleichen
3. Wenn die absolute Differenz größer 3 * 86400, dann ist es älter als drei Tage


//EDIT:
Ah, es gibt CPAN:Time::Piece und CPAN:Time::Piece::DB2 da kannst du die Differenz einfach berechnen. Hoffe ich.

Ungetestet:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use DBI;
use DBD::DB2::Constants;
use DBD::DB2;

use Time::Piece;
use Time::Piece::DB2;

my $now = localtime; # das ist das localtime von Time::Piece!!!
 
# Zugangsdaten Datenbank
my ( $username, $password ) = ( 'usermurks22', 'OxMoxPurrl123');

# Datenbank verbinden
my $dbh = DBI->connect("dbi:DB2:db_name", $username, $password); # !!! musst du für dich anpassen!!!!

# SQL für Abfrage des Datums erzeugen 
my $SQL = 'SELECT date1 FROM table221';   # !!! musst du für dich anpassen!!!

# SQL vorbereiten
my $sth = $dbh->prepare( $SQL );

# SQL auaführen
$dbh->execute();

# eine Datenbankzeile auslesen
my @row = $sth->fetchrow;

# gewünschtes Datum aus Puffer holen
my $db2_date = $row[0];

# DB2 timestamp in Time::Piece-Objekt umwandeln
my $time = Time::Piece->from_db2_timestamp( $db2_date );

# Datum vergleichen
if ( abs($now-$time) > 3 * ONE_DAY) { # älter als 3 Tage
  ...
  ... 
}


Editiert von GwenDragon: beispiel für Time-Piece
Last edited: 2015-04-09 18:57:06 +0200 (CEST)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

View full thread SQL-Datum mit Perl-Datum subtrahieren (DB2)