web-dev-qa-db-fra.com

Oracle utilise LIKE '%' le DATE

Ma table myTab a la colonne startDate, qui a le type de données "DATE". Les données de cette colonne sont stockées comme dd.mm.yyyy.

Maintenant, j'essaie d'obtenir des données avec cette requête:

SELECT * FROM myTab WHERE startDate like '%01.2015"

D'une certaine manière, cela ne fonctionne pas et je ne sais pas pourquoi.

J'espère que quelqu'un peut aider.

5
Mihawk

Pour effectuer une recherche de texte à la date, vous devez convertir la date en texte.

Il est plus efficace de calculer la première et la dernière date de ce que vous voulez trouver et de tout obtenir entre eux. Ainsi, les comparaisons numériques sont remplacées par des correspondances de modèle de texte et peuvent utiliser un index s'il en existe un:

SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'
18
Guffa
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'
2
tib

Si le type de champ est "DATE", alors la valeur n'est pas stockée sous forme de chaîne, c'est un nombre géré par Oracle. Vous devez donc le convertir en chaîne:

SELECT * FROM myTab WHERE to_char(startDate, 'MM.YYYY') = '01.2015';

Vous pouvez également utiliser des plages de dates dans les requêtes SQL:

SELECT * FROM myTab 
WHERE startDate 
BETWEEN to_date('01.01.2015', 'DD.MM.YYYY') 
AND     to_date('31.01.2015', 'DD.MM.YYYY');
2
mbk

En ce qui concerne votre question actuelle "En quelque sorte, cela ne fonctionne pas et je ne sais pas pourquoi."

Oracle effectue une conversion implicite de DATE à VARHCAR2, mais utilise le NLS_DATE_FORMAT par défaut, qui est probablement différent de celui que vous utilisez dans votre requête.

1

Les données de cette colonne sont stockées comme dd.mm.yyyy.

Oracle ne stocke pas la date dans le format que vous voyez. Il le stocke en interne dans un format propriétaire sur 7 octets, chaque octet stockant différents composants de la valeur datetime.

WHERE startDate comme '% 01.2015 "

Vous comparez un DATE avec un CHA&ICIRC;NE, ce qui est inutile. 

À partir de performances, vous devez utiliser un condition de plage de dates afin que, s'il y ait un élément {INDEX normal sur la colonne de date, il sera utilisé . 

SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'

Pour comprendre pourquoi une condition de plage de dates est meilleure en termes de performances, regardez ma réponse ici .

1
Lalit Kumar B

Pour fournir une réponse plus détaillée et résoudre ce problème https://stackoverflow.com/a/42429550/1267661 answer.

Dans Oracle, une colonne de type "date" n'est ni un nombre ni une chaîne, mais une valeur "datetime" avec l'année, le mois, le jour, l'heure, les minutes et les secondes . L'heure par défaut est toujours minuit "00:00: 00 "

La requête:

Select * From bdPedidos Where Data Like '%" + data + "%'" 

ne fonctionnera pas dans toutes les circonstances, car une colonne de date n'est pas une chaîne; utiliser "comme" force Oracle à convertir la valeur de date en valeur de chaîne . La valeur de chaîne peut être année-mois-jour-heure ou mois -day-year-time ou day-month-year-time, tout dépend de la manière dont une instance Oracle particulière a défini le paramètre NLS_DATE_FORMAT pour afficher les dates sous forme de chaînes.

La bonne façon de couvrir tous les temps possibles dans une journée est la suivante:

Select * 
From bdPedidos 
Where Data between to_date('" + data + " 00:00:00','yyyy-mm-dd hh24:mi:ss')
               and to_date('" + data + " 23:59:59','yyyy-mm-dd hh24:mi:ss')
0
alvalongo

J'ai résolu mon problème de cette façon. Merci pour les suggestions d'améliorations. Exemple en C #.

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
0
Eronildo Barbosa