Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SQL - Konwersja daty
Forum PHP.pl > Forum > Bazy danych > MySQL
noiragneau
  1. <?php
  2. class TerminyService
  3. {
  4.    function TerminyService()
  5.    {
  6.        include("TerminyService.methodTable.php");
  7.        mysql_connect('localhost', 'root', '');
  8.        mysql_select_db('amfphp');
  9. }
  10.  
  11.    function pokazTerminy($dataMiesiac, $dataRok)
  12.  
  13.    {
  14.  
  15.        $sql = sprintf( "SELECT id AS data, CONCAT('Od: ', dataStart, ' Do: ', dataKoniec, ' (', opis, ')') AS label FROM terminy WHERE month(dataStart) >= %d AND year(dataStart) >= %d ORDER BY month(dataStart), day(dataStart)",
  16.                    $dataMiesiac,
  17.                    $dataRok);
  18.        $query = mysql_query($sql);
  19.        NetDebug::trace($sql);
  20.        NetDebug::trace(mysql_error());
  21.        return $query;
  22.  
  23.    }
  24. }
  25. ?>


Witam.

Po wykonaniu zapytania SQL zamieszczonego powyżej dostaje wynik:
Od: 2009-02-02 Do: 2009-02-03 (Konferencja biznesowa)
Od: 2009-03-20 Do: 2009-03-21 (Wesele)

itd

Niestety mam mały problem i tu proszę o pomoc:
Jak zmienić kod aby po zapytaniu SQL wyświetliło się:
Od 2 luty(poniedziałek) do 3 luty(wtorek) - Konferencja biznesowa ?
kefirek
Proszę
  1. <?php
  2. $data = '2009-02-03';
  3. function data($data){
  4.  
  5. $miesiace = array('01' => 'Styczeń', '02' => 'Luty', '03' => 'Marzec', '04' => 'Kwiecień', '05' => 'Maj', '06' => 'Czerwiec', '07' => 'Lipiec', '08' => 'Sierpień', '09' => 'Wrzesień', '10' => 'Październik', '11' => 'Listopad', '12' => 'Grudzień');  
  6. $dni = array( 0 => 'Niedziela', 1 => 'Poniedziałek', 2 => 'Wtorek', 3 => 'Środa', 4 => 'Czwartek', 5 => 'Piątek', 6 => 'Sobota');
  7.  
  8. $data =  date('j', strtotime($data)).' '.$miesiace[date('m', strtotime($data))].' ( '.$dni[date('w', strtotime($data))].' )';
  9.  
  10. return $data;
  11. }
  12.  
  13. echo data($data);
  14. ?>
noiragneau
ale jak to zrobić żeby funkcja brała to sobie z tego SELECTa ?
kilas88
Kod
CONCAT(

  'Od: ',
  DATE_FORMAT(dataStart, '%e %M (%a)'),

  ' Do: ',
  DATE_FORMAT(dataKoniec, '%e %M (%a)'),

  ' (', opis, ')'

) AS label

choć jak na moje to lepiej byłoby przekazywać sztywną datę (dateStart, dateKoniec) do funkcji, którą zapodał kefirek.
noiragneau
Cytat(kilas88 @ 8.04.2009, 19:05:49 ) *
Kod
CONCAT(

  'Od: ',
  DATE_FORMAT(dataStart, '%e %M (%a)'),

  ' Do: ',
  DATE_FORMAT(dataKoniec, '%e %M (%a)'),

  ' (', opis, ')'

) AS label

choć jak na moje to lepiej byłoby przekazywać sztywną datę (dateStart, dateKoniec) do funkcji, którą zapodał kefirek.

Twój sposób już próbowałem ale wtedy wyświetlają się nazwy po angielskiu a ja potrzebuje po polski.


Tylko nie wiem jak połączyć funkcje kefirka z moim kodem :/
erix
Cytat
a ja potrzebuje po polski.

http://dev.mysql.com/doc/refman/5.0/en/locale-support.html
noiragneau
Cytat(erix @ 8.04.2009, 19:59:29 ) *




może coś źle robię :/


wykonuje: 

SET lc_time_names = 'pl_PL';

następnie:

SELECT @@lc_time_names;

ale nadal jest:

@@lc_time_names 
en_US



zamiast pl_PL :/
erix
Mam nadzieję, że to w ramach jednego połączenia wykonujesz, czy kilku osobnych?
noiragneau
http://dev.mysql.com/doc/refman/5.0/en/locale-support.html było w osobnych

no ale wykonałem razem

SET lc_time_names = 'pl_PL';
SELECT @@lc_time_names;
i zadziałało




jak połączyłem powyższe z moim SELECTEM to wywalało mi błąd z CONCAT :/

jeszcze coś pokombinuje
erix
Jaki błąd?
noiragneau
  1. SET lc_time_names = 'pl_PL';
  2. SELECT @@lc_time_names;
  3. SELECT id AS DATA, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ', dataKoniec, ' (', opis, ')') AS label FROM terminy WHERE month(dataStart) >= 1 AND year(dataStart) >= 2009 ORDER BY month(dataStart), day(dataStart)


wykonuje się poprawnie i wyświetla się:

Od: 02 luty Do: 2009-02-03 (Konferencja biznesowa)



  1. SET lc_time_names = 'pl_PL';
  2. SELECT @@lc_time_names;
  3. SELECT id AS DATA, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ', DATE_FORMAT(dataKoniec, '%d %M %Y'), ' (', opis, ')') AS label FROM terminy WHERE month(dataStart) >= 1 AND year(dataStart) >= 2009 ORDER BY month(dataStart), day(dataStart)


error: #1271 - Illegal mix of collations for operation 'concat'
erix
  1. jakie masz kodowanie dla połączenia?
  2. jakie kodowanie dla kolumn?
Powinny być IMHO takie same.
noiragneau
gdzie to sprawdzić?
erix
  1. http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
  2. jeśli używasz PMA, to masz kolumnę zestaw znaków
noiragneau
PMA: utf8_general_ci

i niby mam ustawione kodowanie na $gateway->setCharsetHandler("iconv", "ISO-8859-2", "ISO-8859-2");

ale na razie wykonuje SELECTy tylko z poziomu bazy danych
erix
A dla kolumn?

[php]setCharsetHandler("iconv", "ISO-8859-2", "ISO-8859-2");[php]
Mhmm, a nie możesz korzystać wszędzie z UTF?
noiragneau
no rzeczywiście bład był w dekodowaniu.

W phpMyAdmin

  1. "SET lc_time_names = 'pl_PL'; 
  2.   SELECT @@lc_time_names; 
  3.   SELECT id AS data, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ', 
  4.   DATE_FORMAT(dataKoniec, '%d %M %Y'), ' (', opis, ')') AS label FROM terminy 
  5.   WHERE month(dataStart) >= %d AND year(dataStart) >= %d ORDER BY month(dataStart), day(dataStart)


wyświetliło się poprawnie:
Od: 02 luty Do: 03 luty 2009 (Konferencja biznesowa)




niestety w php już gorzej:/
kod wygląda tak
  1. <?php
  2. class TerminyService
  3. {
  4.  function TerminyService()
  5.  {
  6.      include("TerminyService.methodTable.php");
  7.      mysql_connect('localhost', 'root', '');
  8.      mysql_select_db('amfphp');
  9.  }
  10.  
  11.  function pokazTerminy($dataMiesiac, $dataRok)
  12.  {
  13.      $sql = sprintf("SET lc_time_names = 'pl_PL'; 
  14.      SELECT @@lc_time_names; 
  15.      SELECT id AS data, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ', 
  16.      DATE_FORMAT(dataKoniec, '%d %M %Y'), ' (', opis, ')') AS label FROM terminy 
  17.      WHERE month(dataStart) >= %d AND year(dataStart) >= %d ORDER BY month(dataStart), day(dataStart)",
  18.                  $dataMiesiac,
  19.                  $dataRok);
  20.      $query = mysql_query($sql);
  21.      NetDebug::trace($sql);
  22.      NetDebug::trace(mysql_error());
  23.      return $query;
  24.  }
  25. }
  26. ?>


Wywala błąd:
(Object)#0
  message = "faultCode:AMFPHP_RUNTIME_ERROR faultString:'sprintf(): Too few arguments' faultDetail:'C:\xampp\htdocs\testZSQL\services\TerminyService.php on line 16'" (powyżej to jest linia 20)

dla php:
$gateway->setCharsetHandler("none", "utf-8", "utf-8");
pyro
Nie można w mysql_query wykonywać kilku zapytań na raz.
noiragneau
Cytat(pyro @ 9.04.2009, 10:16:02 ) *
Nie można w mysql_query wykonywać kilku zapytań na raz.




po usunięciu 
  1. SET lc_time_names = 'pl_PL'
  2.   SELECT @@lc_time_names;


i wykonaniu tylko
  1. SELECT id AS DATA, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ',
  2.   DATE_FORMAT(dataKoniec, '%d %M %Y'), ' (', opis, ')') AS label FROM terminy
  3.   WHERE month(dataStart) >= %d AND year(dataStart) >= %d ORDER BY month(dataStart), day(dataStart)


pojawia się ten sam błąd w tym samym miejscu
erix
Wykonaj kilka mysql_query" title="Zobacz w manualu PHP" target="_manual z każdym z zapytań osobno.
noiragneau
Cytat(erix @ 9.04.2009, 11:37:55 ) *
Wykonaj kilka mysql_query" title="Zobacz w manualu PHP" target="_manual z każdym z zapytań osobno.


dzięki wszystkim tutaj którzy pomogli.
ostateczny kod to:



  1. <?php
  2. class TerminyService
  3. {
  4.  function TerminyService()
  5.  {
  6.      include("TerminyService.methodTable.php");
  7.      mysql_connect('localhost', 'root', '');
  8.      mysql_select_db('amfphp');
  9.  }
  10.  
  11.  function pokazTerminy($dataMiesiac, $dataRok)
  12.  {
  13.      mysql_query("SET lc_time_names = 'pl_PL'");
  14.      mysql_query("SELECT @@lc_time_names");
  15.      $sql = ("SELECT id AS data, CONCAT('Od: ', DATE_FORMAT(dataStart, '%d %M'), ' Do: ', DATE_FORMAT(dataKoniec, '%d %M %Y'), ' (', opis, ')') AS label FROM terminy WHERE month(dataStart) >= ".$dataMiesiac." AND year(dataStart) >= ".$dataRok." ORDER BY month(dataStart), day(dataStart)");
  16.      $query=mysql_query($sql);
  17.      NetDebug::trace($sql);
  18.      NetDebug::trace(mysql_error());
  19.      return $query;
  20.  }
  21. }
  22. ?>


oczywiście wszystko chodzi aż miło:)

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.