2017-06-05 1 views
0

J'essaie d'obtenir tous les enregistrements entre deux dates. Cependant, je ne reçois que des enregistrements avec une seule date. Ma structure de date est Varchar (20).Fonction Entre Date MM/JJ/AAAA Mysql

Voilà ma question:

Pouvez-vous me aider? :(

SELECT a.DOB as `DATE`, 
     (CASE when f.INHOUR > 12 or f.INHour = 12 Then 'PM' 
      else 'AM' END) as Shift, 
     concat(b.FIRSTNAME, ' ', b.LASTNAME) Fullname, 
     a.Amount as DECLARED, 
     SUM(c.Amount) as CALCULATED, 
     a.AMOUNT as `NET OF SPECIAL SALES`, 
     d.Amount as `CASH OVER SHORT`, 
     a.AMOUNT as `CASH DEPOSIT` 
FROM gndsale a 
INNER JOIN emp b 
ON  a.ID= b.ID 
INNER JOIN gndsale c 
ON  b.ID= c.ID 
INNER JOIN gndsale d 
on  b.ID = d.ID 
INNER JOIN adjtime f 
on a.ID= f.ID 
WHERE a.type = "22" 
AND c.type = "4" 
AND d.type = "42" 
and (a.DOB BETWEEN '5/1/2017' AND '5/19/2017') 
GROUP BY b.ID 
+0

_ « Ma structure date est Varchar (20) » _ - c'est votre erreur, vous devez corriger d'abord. Utilisez l'un des types de date et d'heure fournis par la base de données. – CBroe

+0

je ne peux pas convertir en quelque sorte mon varchar à ce jour? parce que tous mes champs de données sont dans ce format –

+0

Quand nous avons des types de données 'Date',' Timestamp' dans MySQL, pourquoi avez-vous choisi le type 'varchar' pour les valeurs du champ de date pourquoi ??? – itzmukeshy7

Répondre

1

Si votre DOB colonne vraiment être du texte, alors vous devriez sérieusement envisager de passer cette colonne à un type de date. Cela dit, si vous devez procéder comme il est, vous pouvez tirer parti de MySQL de STR_TO_DATE() fonction, qui peut convertir vos dates de texte en types de date réelle. ensuite, utilisez la même comparaison. Remarque BETWEEN que j'ai remplacé votre mm/DD/YYYY littéraux de date incorrecte avec littéraux conforme ANSI de former alors YYYY/mm/DD.

WHERE 
    STR_TO_DATE(a.DOB, '%m/%d/%Y') BETWEEN '2017-05-01' AND '2017-05-19' 
1
SELECT a.DOB as `DATE`, (CASE when f.INHOUR > 12 or f.INHour = 12 Then 'PM' 
else 'AM' END) as Shift, concat(b.FIRSTNAME, ' ', b.LASTNAME) Fullname, 
a.Amount as DECLARED, SUM(c.Amount) as CALCULATED, a.AMOUNT as `NET OF 
SPECIAL SALES`, d.Amount as `CASH OVER SHORT`, a.AMOUNT as `CASH DEPOSIT` 
FROM gndsale a INNER JOIN emp b ON a.ID= b.ID INNER JOIN gndsale c ON 
b.ID= c.ID INNER JOIN gndsale d on b.ID = d.ID INNER JOIN 
adjtime f on a.ID= f.ID WHERE a.type = "22" AND c.type = "4" 
AND d.type = "42" and (STR_TO_DATE(a.DOB BETWEEN,'%m-%d-%Y') STR_TO_DATE('5/1/2017','%m-%d-%Y') AND '5/19/2017','%m-%d-%Y')) GROUP BY 
b.ID 
1

::: S'IL VOUS PLAÎT ESSAYEZ

SELECT a.DOB as `DATE`, 
    (CASE when f.INHOUR > 12 or f.INHour = 12 Then 'PM' 
     else 'AM' END) as Shift, 
    concat(b.FIRSTNAME, ' ', b.LASTNAME) Fullname, 
    a.Amount as DECLARED, 
    SUM(c.Amount) as CALCULATED, 
    a.AMOUNT as `NET OF SPECIAL SALES`, 
    d.Amount as `CASH OVER SHORT`, 
    a.AMOUNT as `CASH DEPOSIT` 
FROM gndsale a 
INNER JOIN emp b 
ON  a.ID= b.ID 
INNER JOIN gndsale c 
ON  b.ID= c.ID 
INNER JOIN gndsale d 
on  b.ID = d.ID 
INNER JOIN adjtime f 
on a.ID= f.ID 
WHERE a.type = "22" 
AND c.type = "4" 
AND d.type = "42" 
AND (a.DOB BETWEEN CAST('5/1/2017') as date) AND CAST('5/19/2017' as date)) 
GROUP BY b.ID 

L'ENTRE CLAUSE NE PEUT PAS ETRE UTILISE AVEC DATES SOUS FORME DE CHAÎNE DE CARACTÈRES. (IL PEUT ÊTRE, MAIS QUI NE SERAIT PAS LOGIQUE)

ACCLAMATIONS

+0

L'OP utilise MySQL, pas SQL Server. –

+0

Je reçois une erreur avec l'alias datetime –

+0

@VirgilCruz, désolé pour cela. j'ai édité la réponse. veuillez vous y référer. datetime en réalité, là, n'est pas un nom d'alias. La chaîne de date char a dû être transtypée en date. ce ne serait pas un problème s'il est converti en datatype datetime. – PrinceKayastha