Czy możliwe jest wstawianie wielu wierszy na raz w bazie danych SQLite?

W MySQL możesz wstawić wiele wierszy w następujący sposób:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

Jednak dostaję błąd, gdy próbuję zrobić coś takiego. Czy możliwe jest wstawianie wielu wierszy na raz w bazie danych SQLite? Jaka jest składnia, aby to zrobić?

Author: Andrew, 2009-10-23

24 answers

Update

Jako BrianCampbell wskazuje tutaj, SQLite 3.7.11 i nowsze obsługuje teraz prostszą składnię oryginalnego postu . Jednak przedstawione podejście jest nadal odpowiednie, jeśli chcesz uzyskać maksymalną zgodność ze starszymi bazami danych.

Oryginalna odpowiedź

Gdybym miał uprawnienia, uderzyłbym odpowiedź andy ' ego: ty Możesz wstawić wiele wierszy w SQLite, wystarczy Inna składnia . Aby było to doskonale jasne, OPs MySQL przykład:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

To można przekształcić w SQLite jako:

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

UWAGA o wykonaniu

Pierwotnie używałem tej techniki do efektywnego ładowania dużych zbiorów danych z Ruby on Rails. jednakże, jak zaznacza Jaime Cook , nie jest jasne, czy jest to szybsze pakowanie pojedynczych INSERTs w ramach jednej transakcji:

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

Jeśli wydajność jest twoim celem, powinieneś najpierw spróbować tego.

Notatka o Unii vs Unia wszystkie

Jako kilka ludzie skomentowali, że jeśli użyjesz UNION ALL (Jak pokazano powyżej), wszystkie wiersze zostaną wstawione, więc w tym przypadku otrzymasz cztery wiersze data1, data2. Jeśli pominiesz ALL, zduplikowane wiersze zostaną wyeliminowane (a operacja prawdopodobnie będzie nieco wolniejsza). Używamy Unii, ponieważ bardziej pasuje do semantyki oryginalnego postu.

In closing

P. S.: Proszę +1 odpowiedz andy'ego , nie moja! Jako pierwszy przedstawił rozwiązanie.

 559
Author: fearless_fool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Tak, jest to możliwe, ale nie przy zwykłych wartościach wstawiania oddzielonych przecinkami.

Spróbuj tego...
insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

Tak, to trochę brzydkie, ale wystarczająco łatwe zautomatyzować generowanie instrukcji z zestawu wartości. Wydaje się również, że wystarczy zadeklarować nazwy kolumn w pierwszym select.

 531
Author: andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 12:06:02

Tak, od SQLite 3.7.11 jest to obsługiwane w SQLite. Z dokumentacji SQLite :

Składnia instrukcji SQLite INSERT

(Kiedy ta odpowiedź była oryginalnie napisana, nie była obsługiwana)

Dla kompatybilności ze starszymi wersjami SQLite, możesz użyć sztuczki sugerowanej przez andy i fearless_fool używając UNION, ale dla wersji 3.7.11 i późniejszych powinna być preferowana prostsza składnia opisana tutaj.

 222
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:59

Napisałem trochę kodu ruby, aby wygenerować pojedynczą 500-elementową wielowierszową wstawkę z serii instrukcji insert, która była znacznie szybsza niż uruchamianie poszczególnych wstawek. Następnie próbowałem po prostu owijać wiele wkładek w jedną transakcję i okazało się, że mogę uzyskać ten sam rodzaj przyspieszenia przy znacznie mniejszej ilości kodu.

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
 52
Author: Jamie Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-06 06:26:04

Zgodnie z ta strona nie jest obsługiwana:

  • 2007-12-03: Multi-row INSERT vel compound INSERT not supported.
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

Właściwie, zgodnie ze standardem SQL92, wyrażenie wartości powinno stać na sobie. Na przykład poniższa tabela powinna zwracać jedną kolumnę z trzema wierszami: VALUES 'john', 'mary', 'paul';

Od wersji 3.7.11 SQLite obsługuje multi-row-insert . Richard Hipp komentarze:

" nowa wielowartościowa wstawka jest tylko składniowym sugerem (SIC) dla związku insert. Nie ma żadnej przewagi wydajności w ten czy inny sposób."

 37
Author: typeseven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-20 22:54:11

Zacznij od wersji 2012-03-20 (3.7.11), sqlite obsługuje następującą składnię wstawiania:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

Przeczytaj dokumentację: http://www.sqlite.org/lang_insert.html

PS: Proszę +1 do odpowiedzi/odpowiedzi Briana Campbella. nie moje! Jako pierwszy przedstawił rozwiązanie.

 13
Author: mjb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 16:13:14

Jak powiedzieli inni plakaty, SQLite nie obsługuje tej składni. Nie wiem, czy wkładki złożone są częścią standardu SQL, ale z mojego doświadczenia wynika, że są a nie zaimplementowane w wielu produktach.

Na marginesie, powinieneś mieć świadomość, że wydajność wstawiania w SQLite znacznie się poprawia, jeśli zawiniesz wiele wstawek w jawną transakcję.

 10
Author: Larry Lustig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 12:21:19

Tak, sql może to zrobić, ale z inną składnią. Dokumentacja sqlite jest całkiem niezła. To powie Ci również, że jedynym sposobem Wstawienia kilku wierszy jest użycie instrukcji select jako źródła danych do wstawienia.

 10
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-27 21:20:25

Sqlite3 nie może tego zrobić bezpośrednio w SQL, z wyjątkiem SELECT, i chociaż SELECT może zwrócić" wiersz " wyrażeń, wiem, że nie ma sposobu, aby zwrócić fałszywą kolumnę.

Jednak CLI może to zrobić:

.import FILE TABLE     Import data from FILE into TABLE
.separator STRING      Change separator used by output mode and .import

$ sqlite3 /tmp/test.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table abc (a);
sqlite> .import /dev/tty abc
1
2
3
99
^D
sqlite> select * from abc;
1
2
3
99
sqlite> 

Jeśli umieścisz pętlę wokół wstawki, zamiast używać polecenia CLI .import, pamiętaj, aby postępować zgodnie z poradami w FAQ SQLite dla szybkości wstawiania:

Domyślnie każda instrukcja INSERT jest własnej transakcji. Ale jeśli surround multiple INSERT Oświadczenia z początku...COMMIT then all the wkładki są pogrupowane w jeden transakcja. Czas potrzebny na zaangażowanie transakcja jest amortyzowana przez wszystkie załączone Oświadczenia wkładki i tak czas na polecenie insert wynosi znacznie zmniejszona.

Inną opcją jest uruchomienie pragmy / align = "left" / Polecenie to będzie powoduje, że SQLite nie czeka na dane do dotrzeć do powierzchni dysku, co będzie sprawiają, że operacje zapisu wydają się być dużo szybciej. Ale jeśli stracisz władzę w na w środku transakcji, Twój plik bazy danych może zostać uszkodzony.

 8
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 20:39:15

Alex ma rację: "wybierz ... oświadczenie Unii straci kolejność, co jest bardzo ważne dla niektórych użytkowników. Nawet po wstawieniu w określonym porządku, SQLite zmienia rzeczy, więc wolą używać transakcji, jeśli kolejność Wstaw jest ważna.

create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction;    

select rowid,* from t_example;
1|8
2|4
3|9
 7
Author: AG1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 07:11:39

Fearless_fool ma świetną odpowiedź dla starszych wersji. Chciałem tylko dodać, że musisz upewnić się, że masz wszystkie kolumny wymienione. Więc jeśli masz 3 kolumny, musisz upewnić się, że select działa na 3 kolumnach.

Przykład: mam 3 kolumny, ale chcę wstawić tylko 2 kolumny wartości danych. Załóżmy, że nie obchodzi mnie pierwsza kolumna, ponieważ jest to standardowy integer id. Mogę zrobić co następuje...

INSERT INTO 'tablename'
      SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'

Uwaga: Zapamiętaj " wybierz ... Unia " oświadczenie straci zamawiam. (Od AG1)

 7
Author: LEO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 17:07:03

Nie możesz, ale myślę, że niczego nie przegapisz.

Ponieważ wywołujesz SQLite zawsze w procesie, prawie nie ma znaczenia w wydajności, czy wykonasz 1 Instrukcję insert, czy 100 instrukcji insert. Commit zajmuje jednak dużo czasu, więc umieść te wstawki 100 wewnątrz transakcji.

Sqlite jest o wiele szybszy, gdy używasz parametryzowanych zapytań (o wiele mniej parsowania), więc nie łączyłbym takich dużych poleceń:

insert into mytable (col1, col2)
select 'a','b'
union 
select 'c','d'
union ...

Muszą być ponownie analizowane i znowu dlatego, że każda konkatenowana wypowiedź jest inna.

 6
Author: tuinstoel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 12:26:26

W mysql lite nie można wstawić wielu wartości, ale możesz zaoszczędzić czas, otwierając połączenie tylko jeden raz, a następnie wykonując wszystkie wkładki, a następnie zamykając połączenie. To oszczędza dużo czasu

 6
Author: g.revolution,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-21 06:05:17
INSERT INTO TABLE_NAME 
            (DATA1, 
             DATA2) 
VALUES      (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2); 
 6
Author: aasai arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 14:29:56

Problem z użyciem transakcji polega na tym, że blokujesz tabelę również do czytania. Więc jeśli masz naprawdę dużo danych do wstawienia i potrzebujesz dostępu do danych, na przykład podgląd lub tak, ten sposób nie działa dobrze.

Problem z innym rozwiązaniem polega na tym, że tracisz kolejność wstawiania

insert into mytable (col)
select 'c'
union 
select 'd'
union 
select 'a'
union 
select 'b';

W sqlite dane będą przechowywane a, b, c, d...

 5
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-07 22:32:13

Od wersji 3.7.11 SQLite obsługuje multi-row-insert. Ryszard Hipp Komentarze:

Używam 3.6.13

Rozkazuję TAK:

insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3 
union select nextV1+, nextV2+, nextV3+

Z 50 rekordami włożonymi na raz, zajmuje to tylko sekundę lub mniej.

To prawda używanie sqlite do wstawiania wielu wierszy naraz jest bardzo możliwe. @ Andy napisał (a):

Dzięki Andy + 1

 5
Author: XenKid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-04 18:21:46
INSERT INTO tabela(coluna1,coluna2) 
SELECT 'texto','outro'
UNION ALL 
SELECT 'mais texto','novo texto';
 4
Author: ademar111190,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 23:22:15

Jeśli używasz wtyczki SQLite manager firefox, obsługuje ona masowe wstawki z INSERT poleceń SQL.

W rzeczywistości nie obsługuje tego, ale SQLite Browser działa (działa na Windows, OS X, Linux)

 2
Author: Chris S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-28 00:28:43

Mam zapytanie jak poniżej, ale ze sterownikiem ODBC SQLite ma błąd z ", " mówi. Uruchamiam vbscript w HTA (aplikacja Html).

INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())
 2
Author: caglaror,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 19:48:02

Na sqlite 3.7.2:

INSERT INTO table_name (column1, column2) 
                SELECT 'value1', 'value1' 
          UNION SELECT 'value2', 'value2' 
          UNION SELECT 'value3', 'value3' 

I tak dalej

 2
Author: ashakirov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-17 14:29:07

Jestem w stanie uczynić zapytanie dynamicznym. To jest mój stół:

CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)

I pobieram wszystkie dane przez JSON, więc po zdobyciu wszystkiego wewnątrz NSArray podążałem za tym:

    NSMutableString *query = [[NSMutableString alloc]init];
    for (int i = 0; i < arr.count; i++)
    {
        NSString *sqlQuery = nil;
        sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",
                    [[arr objectAtIndex:i] objectForKey:@"plannerid"],
                    [[arr objectAtIndex:i] objectForKey:@"probid"],
                    [[arr objectAtIndex:i] objectForKey:@"userid"],
                    [[arr objectAtIndex:i] objectForKey:@"selectedtime"],
                    [[arr objectAtIndex:i] objectForKey:@"isLocal"],
                    [[arr objectAtIndex:i] objectForKey:@"subject"],
                    [[arr objectAtIndex:i] objectForKey:@"comment"],
                    [[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]
                    ];
        [query appendString:sqlQuery];
    }
    // REMOVING LAST COMMA NOW
    [query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];

    query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];

I na koniec zapytanie wyjściowe jest takie:

insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values 
<append 1>
('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
<append 2>
('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'), 
<append 3>
('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
<append 4>
('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'), 
<append 5>
('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'), 
<append 6>
('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
<append 7>
('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'), 
<append 8>
('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'), 
<append 9>
('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')

Który działa dobrze przez KOD również i jestem w stanie zapisać wszystko w SQLite pomyślnie.

Przed tym zrobiłem UNION query rzeczy dynamiczne, ale to zaczęło dawać jakiś błąd składni. W każdym razie, to działa dobrze dla ja.

 2
Author: Vaibhav Saran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 08:42:07

Dziwię się, że nikt nie wspomniał o przygotowanych wypowiedziach . Jeśli nie używasz SQL samodzielnie, a nie w żadnym innym języku, to myślę, że przygotowane instrukcje zawinięte w transakcję byłoby najskuteczniejszym sposobem wstawiania wielu wierszy.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 10:11:08
 0
Author: Mahmoud Badri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 22:30:00

Jeśli używasz powłoki bash, możesz użyć tego:

time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; 
sqlite3 $FILE "select count(*) from tab;"'

Lub jeśli jesteś w SQLite CLI, to musisz to zrobić:

create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;
Jak to działa? Korzysta z tego tabela if tab:
id int
------
1
2

Then select a.id, b.id from tab a, tab b zwraca

a.id int | b.id int
------------------
    1    | 1
    2    | 1
    1    | 2
    2    | 2

I tak dalej. Po pierwszym wykonaniu wstawiamy 2 wiersze, następnie 2^3=8. (trzy ponieważ mamy tab a, tab b, tab c)

Po drugim wykonaniu wstawiamy dodatkowe (2+8)^3=1000 wiersze

Aftern thrid wstawiamy o max(1000^3, 5e5)=500000 wiersze i tak on..

Jest to najszybsza znana mi metoda wypełniania bazy danych SQLite.

 -1
Author: test30,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 15:02:15