2017-06-05 6 views
0

私は2つの日付間のすべてのレコードを取得しようとしています。しかし、私は1つの日付だけで記録を取得しています。私の日付構造はVarchar(20)です。日付関数MM/DD/YYYY Mysqlの間

ここに私のクエリです:

あなたは私を助けることができますか? :(

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

_「私の日付の構造はVARCHAR(20)である」_ - それは、あなたが最初に修正する必要があり、あなたの間違いです。データベースが提供する日付と時刻のいずれかのタイプを使用します。 – CBroe

+0

私は何とか私のvarcharを今日に変換できないのですか?すべてのデータフィールドがその形式になっています –

+0

MySQLで 'Date'、' Timestamp'データ型があるとき、なぜ日付フィールド値に 'varchar'型を選択したのですか??? – itzmukeshy7

答えて

1

あなたDOB列が本当にテキストであれば、あなたは真剣は、日付型にその列の切り替えを検討してください。言われていること、あなたそのまま続行しなければならない場合は、MySQLのSTR_TO_DATE()を活用することができます実際の日付のタイプにあなたのテキストの日付を変換することができます機能が、その後、私はYYYY/mm/DDを形成し、その後のANSI準拠したリテラルを使用して、誤ったmm/DD/YYYY日付リテラルを置き換えることも同じBETWEEN比較。注意してください。

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

してみてください:::

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 

THE BETWEEN句は、文字列の形式で日付を使用することはできません。 (それができる、しかし、それは論理的ではない)

CHEERS

+0

OPはSQL ServerではなくMySQLを使用しています。 –

+0

エイリアスdatetime –

+0

@VirgilCruzでエラーが発生しました。申し訳ありません。私は答えを編集しました。それを参照してください。 実際にはdatetimeですが、別名はありません。 char日付文字列をdateデータ型にキャストする必要がありました。それがdatetimeデータ型に変換されても問題にならないでしょう。 – PrinceKayastha