web-dev-qa-db-fra.com

Problème SQL ORDER BY

Pouvez-vous m'aider s'il vous plaît à résoudre ce problème. J'essaie de classer les résultats d'une requête SQL par date, mais je n'obtiens pas les résultats dont j'ai besoin.

La requête que j'utilise est:

SELECT date FROM tbemp ORDER BY date ASC

Les résultats sont:

01/02/2009
03/01/2009
04/06/2009
05/03/2009
06/12/2008
07/02/2009

Les résultats devraient être:

06/12/2008
03/01/2009
01/02/2009
07/02/2009

Je dois sélectionner la date dans le format ci-dessus.

Votre aide est tres apprecie.

39
dnyaneshwar

Il semble que votre colonne de date ne soit pas de type datetime mais varchar. Vous devez le convertir en date-heure lors du tri:

select date
from tbemp
order by convert(datetime, date, 103) ASC

style 103 = dd/MM/yyyy (msdn)

39
manji

Il me semble que votre colonne n'est pas une colonne de date mais une colonne de texte (varchar/nvarchar, etc.). Vous devriez le stocker dans la base de données sous forme de date, pas de chaîne.

Si vous devez le stocker sous forme de chaîne pour une raison quelconque, stockez-le dans un format pouvant être trié, par exemple. aaaa/mm/jj.

Comme le montre najmeddine, vous pourriez convertir la colonne à chaque accès, mais j'essayerais très fort de ne pas le faire. La base de données fera un travail plus important - elle ne pourra pas conserver les index appropriés, etc. Dans la mesure du possible, stockera les données dans un type approprié aux données elles-mêmes.

15
Jon Skeet

Vous ne savez pas quel dbms vous utilisez mais je le ferais de cette façon dans Microsoft SQL:

select      [date]
from        tbemp 
order by    cast([date] as datetime) asc
12
Michael A

cela fonctionne pour moi:

SELECT datefield FROM myTable ORDER BY CONVERT(DATE, datefield) ASC

6
ghiboz

La réponse suivante peut vous aider

effectuez votre classement en fonction de votre identificateur de date, mais utilisez la fonction to_char () dans la clause select et utilisez un autre identificateur dans la clause select pour la date

par exemple.

SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE,
SUM(APPLCOUNT) AS APPLIED,
SUM(CONFCOUNT) AS CONFIRMED
FROM
    (
        SELECT COUNT(ID) AS APPLCOUNT,
                   0 AS CONFCOUNT,
                   STUDENT.APPLIED_ON AS DISPDATE1
            FROM STUDENT
            WHERE STUDENT.ID = P_ID
            GROUP BY STUDENT.APPLIED_ON
        UNION
            SELECT 0 AS APPLCOUNT,
                   COUNT(ID) AS CONFCOUNT,
                   STUDENT.CONFIRMED_ON AS DISPDATE1
            FROM STUDENT
            WHERE STUDENT.ID = P_ID
            GROUP BY STUDENT.CONFIRMED_ON
    )
GROUP BY DISPDATE1
ORDER BY DISPDATE1;
3
Bhushan Sapre

SELECT CONVERT (car (19), CAST (date AS datetime), 101) comme [date]
FROM tbemp ORDER BY convert (date/heure, date, 101) ASC

3
DiggDev

Essayez d'utiliser ce travail pour moi

select *  from `table_name` ORDER BY STR_TO_DATE(start_date,"%d-%m-%Y") ASC

start_date est le nom du champ

2
khushmeet singh

Cela peut vous aider dans mysql, php.

//your date in any format
$date = $this->input->post('txtCouponExpiry');

$day = (int)substr($date, 3, 2);
$month = (int)substr($date, 0, 2);
$year = (int)substr($date, 7, 4);

$unixTimestamp = mktime(0, 0, 0, $year, $day, $month);

// insert it into database
'date'->$unixTimestamp;

//query for selecting  order by date ASC or DESC
select * from table order_by date asc;
1
Jayaprakasha

Je voulais éditer plusieurs événements en ordre chronologique chonologique, et je viens de faire un:

select 
TO_CHAR(startdate,'YYYYMMDD') dateorder,
TO_CHAR(startdate,'DD/MM/YYYY') startdate,
...
from ...
...
order by dateorder desc

et cela fonctionne pour moi. Mais sûrement pas adapté à tous les cas ... J'espère juste que ça va aider quelqu'un!

1
user3564654

essaye ça

Order by Convert(datetime,@date) desc
1
Zainul Abid