web-dev-qa-db-fra.com

Comparaison de date Sybase - Format correct?

Je suis assez nouveau dans Sybase et j'écris une requête pour renvoyer les résultats après une date spécifiée et également avant une date spécifiée. Format MM/JJ/AAAA

En ce moment je fais ..

SELECT * 
    From aTable
      WHERE afterDate >= 08/07/2013
        AND beforeDate <= 08/08/2013

Je récupère des disques, mais comme je suis un débutant Sybase, je veux être sûr que Sybase interprète correctement ces dates.

Leur doc en ligne est assez mauvais pour des explications de base sur des choses comme ça! Quelqu'un peut-il confirmer si mon travail fonctionne ou s'il a besoin d'un formatage autour des dates?

5
deanmau5

Vous aurez besoin de convertir les dates en DATETIME et d'indiquer à sybase le format à utiliser.
Selon cette documentation le code pour MM/JJ/AAAA est 101, donc quelque chose comme ceci:

SELECT * 
FROM aTable
WHERE afterDate >= CONVERT(DATETIME,'08/07/2013',101)
      AND beforeDate <= CONVERT(DATETIME,'08/08/2013',101)

Vous pouvez voir la différence en exécutant les instructions de sélection suivantes:

SELECT CONVERT(DATETIME,'08/07/2013',101)  --MM/DD/YYYY (2013-08-07 00:00:00.000)
SELECT CONVERT(DATETIME,'08/07/2013',103)  --DD/MM/YYYY (2013-07-08 00:00:00.000)
11
twoleggedhorse

Pour tout champ date-heure dans sybase, au lieu de passer par la fonction convert, il existe une approche plus directe.

SELECT * 
From aTable
  WHERE afterDate >= '2013-08-07'
    AND beforeDate <= '2013-08-08'

La date doit être sous la forme 'AAAA-MM-JJ'

Si vous souhaitez ajouter une heure, vous pouvez l'inclure avec la date. La date et l'heure doivent être séparées par un T.

Tout champ date/heure peut être utilisé directement au format 'AAAA-MM-JJTHH: MM: SS'

Utiliser les fonctions est trop long. Personne n'a besoin d'un bazooka pour tirer sur un écureuil! :)

3
Gaurav Swaroop
CAST( '2000-10-31' AS DATE )

convertira du texte au format de date ....

Je suppose que vos deux champs (afterDate et beforeDate) sont au format Date.

Votre exemple serait:

SELECT * 
From aTable
  WHERE afterDate >= CAST( '08/07/2013' AS DATE )
    AND beforeDate <= CAST( '08/08/2013' AS DATE )

En outre, généralement (mais pas toujours) une plage de dates figure dans le champ SAME. Comme je l'ai dit, ce n'est pas vrai tout le temps et vous pouvez avoir une bonne raison pour cela.

3
Jim

La meilleure approche consiste à utiliser la norme ANSI qui ne nécessite aucune conversion: aaaammjj (vous pouvez également inclure hh: mm: ss), par exemple:

DateField1> = "20150101" et DateFile1 <= "20150102"

1
David

Vous devez choisir les chaînes d'entrée que l'utilisateur va utiliser en tant que paramètre, puis les convertir et les concaténer comme vous le souhaitez. À moins que Datetime ne soit pas important de choisir son format initial, vous pouvez l'utiliser dans des conditions intermédiaires.

Par exemple. l'utilisateur vient d'Europe et utilise "DD.MM.YY" et "hh: mm" comme paramètre d'entrée. Je convertirais et concaténerais comme ceci:

 WHERE dateCol between convert(DATETIME, 
                               convert(char(11), 
                                       convert(DATETIME, '01.06.14', 4), 16) || ' ' || '00:00', 8) 
    AND convert(DATETIME, 
                convert(char(11), 
                        convert(DATETIME, '01.07.14', 4), 16) || ' ' || '16:00', 8)
0
Clevemayer