PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → Etats & Requêtes → Requête SQL sous HFSQL avec Date et heure
Requête SQL sous HFSQL avec Date et heure
Débuté par Josh Fustier, 04 avr. 2023 19:45 - 4 réponses
Posté le 04 avril 2023 - 19:45
Bonjour,

Je rencontre un problème assez embêtant au niveau d'une requête SQL avec date et heures.

J'ai une table de ligne de factures "LFACTURE" qui contient X colonnes dont :

- LFDJOU de type Date sur 8 octets
- LFHEURE de type Heure sur 6 octets

Je souhaite récupérer toutes les lignes comprises entre deux dates (pour l'exemple) :
le 01/03/2023 à 17h00 et 0 secondes et le 02/03/2023 à 5h35 et 12 secondes

Actuellement la seule solution fonctionnelle que j'ai trouvé est de concaténer la date et l'heure en une string, voici un exemple.

SELECT LFACTURE.LFFFCLEUNIK AS ID
FROM LFACTURE
WHERE CONCAT(LFACTURE.LFDJOU, LFACTURE.LFHEURE) BETWEEN '20230301170000' AND '20230302053512'


Seulement cette solution est peu performante à cause du CONCAT

De plus, impossible de passé directement une date formaté ISO. Je ne comprends pas pourquoi d'ailleurs.

Même mon nouvel ami ChatGPT est incapable de me donner une solution correcte..

Est-ce que l'un de vous aurai une idée de comment optimiser / corriger cette requête ?

Et par la même occasion m'expliquer pourquoi est-ce si compliquer de faire des opérations sur des dates avec HFSQL

PS: contrainte supplémentaire, je ne peux pas modifier la base de données : ajouter des index, modifier des types, etc...

Merci d'avance :)
Membre enregistré
1 message
Posté le 07 juin 2023 - 07:51
Je comprends que vous rencontrez des problèmes avec une requête SQL impliquant des dates et des heures, et que vous cherchez à optimiser et corriger cette requête. Vous utilisez une table appelée "LFACTURE" qui contient une colonne "LFDJOU" de type Date et une colonne "LFHEURE" de type Heure. Vous souhaitez récupérer toutes les lignes comprises entre deux dates spécifiques, mais vous avez actuellement utilisé la concaténation des valeurs date et heure en une seule chaîne de caractères, ce qui affecte les performances. De plus, vous ne pouvez pas directement passer une date formatée ISO dans la requête.

Pour optimiser et corriger cette requête, vous pouvez utiliser la fonction DATEADD pour ajouter des heures, des minutes et des secondes à votre date de départ, et la fonction DATEPART pour extraire les composantes date et heure de https://www.mcdvoice.onl/ votre colonne. Voici un exemple de requête qui pourrait fonctionner :

SELECT LFACTURE.LFFFCLEUNIK AS ID
FROM LFACTURE
WHERE DATEADD(HOUR, DATEPART(HOUR, LFACTURE.LFHEURE),
DATEADD(MINUTE, DATEPART(MINUTE, LFACTURE.LFHEURE),
DATEADD(SECOND, DATEPART(SECOND, LFACTURE.LFHEURE),
LFACTURE.LFDJOU)))) BETWEEN '2023-03-01T17:00:00' AND '2023-03-02T05:35:12'

Dans cette requête, nous utilisons la fonction DATEADD pour ajouter les composantes heure, minute et seconde de la colonne LFHEURE à la date LFDJOU. Ensuite, nous utilisons BETWEEN pour spécifier l'intervalle de dates souhaité.

Il est possible que la performance de cette requête soit meilleure que celle de la concaténation de chaînes de caractères, car les opérations se font directement sur les composantes de date et heure. Cependant, la performance dépendra de l'optimisation interne du système de gestion de base de données que vous utilisez.
Membre enregistré
2 messages
Posté le 12 septembre 2023 - 08:01
Il semble que vous souhaitiez extraire toutes les lignes de votre table "LFACTURE" qui sont comprises entre deux moments précis, en utilisant à la fois une colonne de date (LFDJOU) et une colonne d'heure (LFHEURE). Pour effectuer cette requête SQL, vous pouvez utiliser des opérateurs de comparaison et de logique, ainsi que la concaténation de la date et de l'heure. Voici comment vous pouvez faire cela :

SELECT *
FROM LFACTURE
WHERE
(LFDJOU = '2023-03-01' AND LFHEURE >= '17:00:00')
OR
(LFDJOU = '2023-03-02' AND LFHEURE <= '05:35:12');
Dans cette requête SQL :

Nous utilisons une clause WHERE pour filtrer les lignes de la table "LFACTURE" en fonction de certaines conditions.

La première condition (LFDJOU = '2023-03-01' AND LFHEURE >= '17:00:00') sélectionne toutes les lignes avec une date égale au 1er mars 2023 et une heure égale ou supérieure à 17h00:00.

La deuxième condition (LFDJOU = '2023-03-02' AND LFHEURE <= '05:35:12') sélectionne toutes les lignes avec une date égale au 2 mars 2023 et une heure égale ou inférieure à 05h35:12.

Les deux conditions sont combinées à l'aide de l'opérateur OR, ce qui signifie que la requête retournera toutes les lignes qui satisfont au moins l'une de ces conditions.

Cela devrait vous permettre d'extraire les lignes de votre table "LFACTURE" qui sont comprises entre les deux moments spécifiés. Assurez-vous d'adapter les dates et heures dans la requête en fonction de vos besoins précis.
https://qrcodescanner.org/
Posté le 21 mars 2024 - 09:12
Por ejemplo, puedes usar la función NOW() para obtener la fecha y hora actual, o TIMEDIFF() para calcular la diferencia entre dos tiempos. También hay funciones para manejar fechas específicas, como ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, entre otras.
Posté le 22 mars 2024 - 06:23
deborah escribío:
> Por ejemplo, puedes usar la función NOW() para obtener la fecha y hora actual, o TIMEDIFF() para calcular la diferencia entre dos tiempos. También hay funciones para manejar fechas específicas, como ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, entre otras. https://www.my-indigocard.com

SELECT * FROM votre_table
WHERE votre_colonne_date >= '2024-03-22'
AND votre_colonne_heure >= '10:44:00';