Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-05-2014, 15:07   #1
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
[MySQL] da start time, end time ad intervalli temporali con cambio di data

Ho una tabella così fatta.

Data, Attività, Inizio, Fine
12/05/2014, Lavoro, 08:00, 9:30
12/05/2014, Pausa, 09:30, 09:45
12/05/2014, Lavoro, 23:30, 00:20.

Devo effettuare una query che restituisca grosso modo

Data, Intervallo, Attività, Durata
12/05/2014,08:00, Lavoro, 900 (secondi)
12/05/2014,08:15, Lavoro, 900
12/05/2014,08:30, Lavoro, 900
12/05/2014,08:45, Lavoro, 900
12/05/2014,09:00, Lavoro, 900
12/05/2014,09:15, Lavoro, 900
12/05/2014,09:30, Pausa, 900
12/05/2014,23:30, Lavoro, 900
12/05/2014,23:45, Lavoro, 900
13/05/2014,00:00 Lavoro, 900
13/05/2014,00:15, Lavoro, 300

e mi sto veramente incartando..... HELP!
graz8e
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2014, 15:38   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Se gli orari nella tua tabella coprono sempre intervalli di almeno 15 minuti puoi adottare il seguente metodo.

Prima di tutto creara una tabella di appoggio nella quale inserirai gli orari della giornata (i quarti d'ora).
Poi crea la query facendo una inner join tra la tua tabella e la tabella di appoggio, specificando come criterio che l'orario della tabella di appoggio sia compreso negli orari di inizio e fine della tua tabella.
Resta da calcolare la durata, per farlo è sufficiente sottrarre l'orario di appoggio all'orario di fine, e limitare il risultato a 900 secondi con IIF.
Lascio a te la ricerca delle funzioni per confrontare e convertire date e orari.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2014, 11:52   #3
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
ho creato una tabella con gli orari (a mezz'ora) che si chiama W_INT30.

il risultato l'ho ottenuto (PU--> non ha significato, il controllo sull'attività non ci interessa), I_Att è l'ora inizio attività, F_att l'ora di Fine Attività, I_Fasc ora di iniziofascia e F_Fascia ora di fine fascia.


a questo punto ho un grosso problema di performance.

il campo data (nella tabella originale) è indicizzato.

tuttavia il campo data di output della query è diverso in quanto varia se le attività sono a cavallo di mezza notte. Quindi se nella tabella originale il record era


12/05/2014, Lavoro, 23:30, 00:20.


il risultato per fascia è
data, attivita, I_Fasc, F_fascia, Durata

12/05/2014, Lavoro, 23:30, 24:00, 1800
13/05/2014, Lavoro, 00:00, 00:30, 1200

ma saltano tutti gli indici, e una query da pochi secondi dura mezz'ora..



select ID, PU, DATA,

Attivita, Nome,I_Att,F_att, I_fasc,F_Fasc,

case
when ((I_att <= I_Fasc) and (F_Att >= F_Fasc)) then time_to_sec(timediff (f_Fasc, I_Fasc) ) /* attivita esterna fascia */
when ((I_att>= I_Fasc) and (F_Att <= F_Fasc)) then time_to_sec(Timediff(F_att,I_att)) /*attivita interna ad una fascia */
when ((I_att<= i_fASC) AND (f_ATT <= f_FASC) and (F_Att>= I_Fasc))THEN time_to_sec(TIMEDIFF (f_ATT,i_FASC)) /* ATTIVITA FINISCE IN una fascia */
when ((I_att>=I_fasc) and (F_att>= F_fasc) and (I_att <= F_Fasc)) then time_to_Sec(timediff( f_fasc,I_att)) /* attivita inizia in una fascia */
end as Durata,
case
when (I_att=F_att) and hour(I_att) = 0 then 'SI'end as Giorno_Intero
,
case when instr (Attivita,' - ') > 0 then substring_index(Attivita,' - ',2)
else (/***** SE ATTIVITA non contiente ' - '> ATTIVITA = PRECEDENTE **/
/******* la prima attività potrebbe non esistere.....*/
select
substring_index(Attivita,' - ',2)
from Attivita
where data >=SUBQ.Data and id=SUBQ.ID
and instr (Attivita,' - ') > 0
order by Data desc, Inizio desc limit 0, 1
)
end Campagna

from



/*____SUB --> FULL JOIN ATTIVITA e ORARI____*/
/*____N.B. MYSQL non supporta il fulljoin, quindi è un prodotto cartesiano */
(select
id, pu,
nome, Attivita,

case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio) /*____________case per gestire la corretta attribuzione delle H per giorno su turni cross midnight*/
then addtime(data, '24:00:00')
else data
end as Data,
addtime(data,Att.Inizio) as I_att,
addtime(addtime(data,Att.Inizio),durata)

as F_Att,
case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio)
then addtime(addtime(data, '24:00:00'),Fasce.Inizio)
else addtime(data,Fasce.Inizio)
end as I_Fasc,
case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio)
then addtime(addtime(addtime(data, '24:00:00'),Fasce.Inizio),'00:30:00')
else addtime(addtime(data,Fasce.Inizio),'00:30:00')
end as f_Fasc


from Attivita Att, W_Int30 Fasce

/*_____________ Filtro da eliminare__________*/
Where






/*F_FASCIA > I_ATT*/
(case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio)
then addtime(addtime(addtime(data, '24:00:00'),Fasce.Inizio),'00:30:00')
else addtime(addtime(data,Fasce.Inizio),'00:30:00')
end /*as f_Fasc */) >
addtime(data,Att.Inizio)/* I_att, */
and
/*I_Fascia > F_ATT*/
(case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio)
then addtime(addtime(data, '24:00:00'),Fasce.Inizio)
else addtime(data,Fasce.Inizio)
end) < addtime(addtime(data,Att.Inizio),durata)

and

(case when (Att.fine < Att.Inizio) and (Fasce.Inizio < Att.Inizio)
then addtime(addtime(addtime(data, '24:00:00'),Fasce.Inizio),'00:30:00')
else addtime(addtime(data,Fasce.Inizio),'00:30:00')
end /*as f_Fasc */) >
addtime(data,Att.Inizio)/* I_att, */


) as SUBQ
/*____________________________________________*/





order by data, Pu, id, Nome
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2014, 12:11   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Il mio suggerimento era quello di fare una inner join, ma vedo che hai adottato un approccio diverso, hai provato con il metodo che ti avevo suggerito? Non andava bene?

Suggerimento: usa i tag code ed indenta il codice, senza è illeggibile.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2014, 16:48   #5
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Il mio suggerimento era quello di fare una inner join, ma vedo che hai adottato un approccio diverso, hai provato con il metodo che ti avevo suggerito? Non andava bene?

Suggerimento: usa i tag code ed indenta il codice, senza è illeggibile.
Daniel,
ti ringrazio ma non ho capito COME fare l'inner join...
ho fatto un full join implicito..
perchè con l'inner join se una attività va dalle 14:00 alle 20:00
che regole metto ? ... un aiutino?
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2014, 11:26   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Vedi se così funziona:
Codice:
SELECT IF(attivita.inizio <= w_int30.inizio, attivita.data, date_add(attivita.data, INTERVAL 1 DAY)) AS data,
       w_int30.inizio AS intervallo,
       attivita.attivita,
       LEAST(TIME_TO_SEC(TIMEDIFF(
         TIMESTAMP(IF(attivita.inizio <= attivita.fine, attivita.data, DATE_ADD(attivita.data, INTERVAL 1 DAY)), attivita.fine),
         TIMESTAMP(IF(attivita.inizio <= w_int30.inizio, attivita.data, DATE_ADD(attivita.data, INTERVAL 1 DAY)), w_int30.inizio)
       )), 1800) AS durata
  FROM attivita
 INNER JOIN w_int30 ON (attivita.inizio <= w_int30.inizio AND w_int30.inizio < attivita.fine)
                    OR (
                         attivita.inizio > attivita.fine AND
                         (attivita.inizio <= w_int30.inizio OR w_int30.inizio < attivita.fine)
                       )
 ORDER BY data, w_int30.inizio
Fai dei test perché non l'ho provato, ho verificato solo la sintassi.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2014, 17:48   #7
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Vedi se così funziona:
Codice:
SELECT IF(attivita.inizio <= w_int30.inizio, attivita.data, date_add(attivita.data, INTERVAL 1 DAY)) AS data,
       w_int30.inizio AS intervallo,
       attivita.attivita,
       LEAST(TIME_TO_SEC(TIMEDIFF(
         TIMESTAMP(IF(attivita.inizio <= attivita.fine, attivita.data, DATE_ADD(attivita.data, INTERVAL 1 DAY)), attivita.fine),
         TIMESTAMP(IF(attivita.inizio <= w_int30.inizio, attivita.data, DATE_ADD(attivita.data, INTERVAL 1 DAY)), w_int30.inizio)
       )), 1800) AS durata
  FROM attivita
 INNER JOIN w_int30 ON (attivita.inizio <= w_int30.inizio AND w_int30.inizio < attivita.fine)
                    OR (
                         attivita.inizio > attivita.fine AND
                         (attivita.inizio <= w_int30.inizio OR w_int30.inizio < attivita.fine)
                       )
 ORDER BY data, w_int30.inizio
Fai dei test perché non l'ho provato, ho verificato solo la sintassi.
grazie! collaudo e vediamo....
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 16-06-2014, 14:49   #8
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
Questi i record

5528 CC_Roma 08:00:00 2014-06-16 00:00:00 09:40:00 01:40:00 Help Line - Cartasi' Inbound - Telefono
5528 CC_Roma 09:40:00 2014-06-16 00:00:00 09:55:00 00:15:00 Pausa
5528 CC_Roma 09:55:00 2014-06-16 00:00:00 12:00:00 02:05:00 Help Line - Cartasi' Inbound - Telefono
5528 CC_Roma 12:00:00 2014-06-16 00:00:00 12:30:00 00:30:00 Pranzo_NR
5528 CC_Roma 12:30:00 2014-06-16 00:00:00 14:30:00 02:00:00 Help Line - Cartasi' Inbound - Telefono
5528 CC_Roma 14:30:00 2014-06-16 00:00:00 14:45:00 00:15:00 Pausa
5528 CC_Roma 14:45:00 2014-06-16 00:00:00 16:30:00 01:45:00 Help Line - Cartasi' Inbound - Telefono


questa la query.


select Id,Pu, Data, A.Inizio,A.Fine, Durata, Attivita,
W.Inizio, W.Fine,
IF(A.inizio <= W.inizio, A.data,
date_add(A.data, INTERVAL 1 DAY)) AS dataReale,
LEAST(TIME_TO_SEC(TIMEDIFF(
TIMESTAMP(IF(A.inizio <=A.fine, A.data, DATE_ADD(A.data, INTERVAL 1 DAY)), A.fine),
TIMESTAMP(IF(A.inizio <= W.inizio, A.data, DATE_ADD(A.data, INTERVAL 1 DAY)),W.inizio)
)), 1800) AS duratareale




from Attivita A INNER join
W_Int30 W

ON (A.inizio <=W.inizio AND W.inizio < A.fine)
OR (
A.inizio > A.fine AND
(A.inizio <= W.inizio OR W.inizio < A.fine)
)


where Data ='2014-06-16'
and Pu = 'CC_Roma'
and Id = 5528

order by id, DataReale,W.Inizio


mi fa come risultato

5528 CC_Roma 2014-06-16 00:00:00 08:00:00 09:40:00 01:40:00 Help Line - Cartasi' Inbound - Telefono 08:00:00 08:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 08:00:00 09:40:00 01:40:00 Help Line - Cartasi' Inbound - Telefono 08:30:00 09:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 08:00:00 09:40:00 01:40:00 Help Line - Cartasi' Inbound - Telefono 09:00:00 09:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 08:00:00 09:40:00 01:40:00 Help Line - Cartasi' Inbound - Telefono 09:30:00 10:00:00 2014-06-16 00:00:00 600
5528 CC_Roma 2014-06-16 00:00:00 09:55:00 12:00:00 02:05:00 Help Line - Cartasi' Inbound - Telefono 10:00:00 10:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 09:55:00 12:00:00 02:05:00 Help Line - Cartasi' Inbound - Telefono 10:30:00 11:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 09:55:00 12:00:00 02:05:00 Help Line - Cartasi' Inbound - Telefono 11:00:00 11:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 09:55:00 12:00:00 02:05:00 Help Line - Cartasi' Inbound - Telefono 11:30:00 12:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 12:00:00 12:30:00 00:30:00 Pranzo_NR 12:00:00 12:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 12:30:00 14:30:00 02:00:00 Help Line - Cartasi' Inbound - Telefono 12:30:00 13:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 12:30:00 14:30:00 02:00:00 Help Line - Cartasi' Inbound - Telefono 13:00:00 13:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 12:30:00 14:30:00 02:00:00 Help Line - Cartasi' Inbound - Telefono 13:30:00 14:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 12:30:00 14:30:00 02:00:00 Help Line - Cartasi' Inbound - Telefono 14:00:00 14:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 14:30:00 14:45:00 00:15:00 Pausa 14:30:00 15:00:00 2014-06-16 00:00:00 900
5528 CC_Roma 2014-06-16 00:00:00 14:45:00 16:30:00 01:45:00 Help Line - Cartasi' Inbound - Telefono 15:00:00 15:30:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 14:45:00 16:30:00 01:45:00 Help Line - Cartasi' Inbound - Telefono 15:30:00 16:00:00 2014-06-16 00:00:00 1800
5528 CC_Roma 2014-06-16 00:00:00 14:45:00 16:30:00 01:45:00 Help Line - Cartasi' Inbound - Telefono 16:00:00 16:30:00 2014-06-16 00:00:00 1800

e si perde quindi il record

5528 CC_Roma 09:40:00 2014-06-16 00:00:00 09:55:00 00:15:00 Pausa


AAARGH!!!
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One

Ultima modifica di xp2400 : 16-06-2014 alle 14:56. Motivo: continuo
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 17-06-2014, 10:55   #9
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Puoi mettere i nomi dei campi della tabella? Ci sono più colonne "ora" di quelle che mi aspetterei, non riesco a distinguere quelle che ci interessano, poi per favore, inserisci le query nei tag code in modo che vengano preservati gli spazi, altrimenti la lettura risulta difficoltosa.
Non avendo ben capito quali sono le colonne non ho ancora analizzato il problema, però ti ripeto, la query che ho proposto funziona solo se la durata delle attività è sempre maggiore o uguale a quella degli intervalli (in altre parole deve esserci la garanzia che l'intervallo inizi durante l'attività), in caso contrario bisogna modificare la condizione di join affinché vengano selezionati gli intervalli che comprendono del tutto o in parte l'attività.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 17-06-2014, 14:55   #10
xp2400
Senior Member
 
Iscritto dal: Mar 2004
Città: RoMaNoVeNeTo
Messaggi: 757
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Puoi mettere i nomi dei campi della tabella? Ci sono più colonne "ora" di quelle che mi aspetterei, non riesco a distinguere quelle che ci interessano, poi per favore, inserisci le query nei tag code in modo che vengano preservati gli spazi, altrimenti la lettura risulta difficoltosa.
Non avendo ben capito quali sono le colonne non ho ancora analizzato il problema, però ti ripeto, la query che ho proposto funziona solo se la durata delle attività è sempre maggiore o uguale a quella degli intervalli (in altre parole deve esserci la garanzia che l'intervallo inizi durante l'attività), in caso contrario bisogna modificare la condizione di join affinché vengano selezionati gli intervalli che comprendono del tutto o in parte l'attività.
ho trovato...... mi hai illuminato lo stesso...
__________________
Acer m5500 (Q6600,4MB) Sapphire Ati 3850, Logitech Performance MX, Tastiera Logitech G15, Epson bx 310 FN, QNAP 419p+, WDTVLIVE, Harmony One
xp2400 è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2014, 08:51   #11
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da xp2400 Guarda i messaggi
ho trovato...... mi hai illuminato lo stesso...
Illumina anche noi!
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Samsung ed Sk hynix, i bonus per gli ope...
Windows 11 velocizza Esplora File: ecco ...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
Fastweb scompare dai partner Starlink Mo...
Huawei anticipa tutti con Pura X Max: il...
Amazon Tech Week 2026: RTX 5000, process...
Grandi offerte Amazon su scope elettrich...
Amazon e Anthropic rafforzano la partner...
Elden Ring: il film arriverà fra ...
Mercato PC, +3,2% nel Q1 2026: Lenovo se...
Corsair Platform: scrivanie gaming modul...
Assassin's Creed Black Flag Resynced: Ub...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:49.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v