週末

2016-10-06 4 views
0

を含む2つの列の間の日付は、私は2つの列の間の日付がSTART_DATE MySQLのテーブルから行を選択するMySQLのテーブルからの行の選択、END_DATE含む週末週末

私が試したがthisを見つけたが、それは

役に立ちません

私のテーブルの列は、名前start_date end_dateの金額

土曜日と日曜日を含むstart_dateからend_dateまでの日数の場合、名前と金額を印刷したいとします。

+0

あなたがDAYNAME()関数を試してみましたか? – Pirate

+0

週末を含むことは達成が難しいかもしれません。あなたはこれを試すことができるかもしれません - http://lavaneur.blogspot.in/2012/09/working-days-bw-two-days-weekends-bw.html。 – Jayaprakash

答えて

1

DAYNAME関数を使用します。特定の日付のDaynameを与えます。

select * from yourtable where 
    (DAYNAME(start_date) = 'Saturday' or DAYNAME(start_date) = 'Sunday') and 
    (DAYNAME(end_date) = 'Saturday' or DAYNAME(end_date) = 'Sunday'); 

、これを試してみて、それが役立つことを願っています。

P.S.私はこのクエリを実行しないでください。

+0

それを指摘してくれてありがとう@RiggsFolly。 – Pirate

+0

問題ありません..... – RiggsFolly

+0

回答ありがとうございます。私の質問によると、2日間の週末をチェックしたいのは、start_dateが2016-08-18で、end_dateが2016-08-24で、22と23が週末であることを意味しますこれはこれらの日付の間にあり、この行を取得する必要があります、私にそれを行う方法を提案してください – Raj

0

私が理解するところでは、開始日と終了日として2つの列を取り、それらの間の週末日数を数えたいとします。あれは正しいですか?

この回答How to get list of dates between two dates in mysql select queryには、範囲内のすべての日付のリストを取得するためのSQLがあります。

これを基に、開始結合列と終了列に基づいて必要な日付のみを選択して、内部結合としてその問合せを使用できます。その後、DAYNAMEを使用して日曜日と土曜日を数えます。

ここでは、使用するものに近づく例を示します。 これはまさにあなたが使うべきものではありません!これは、日付をハードコードするためにのみ構築されています(パラメータとして渡すのに非常に近い)。 あなたはそれにあなたのテーブルに参加することによってそれを適応させる必要があります!。私は怠け者であり、テストやデモンストレーションのためにテーブルを作ってみたいと思っていませんでした。(もっと重要なのは)私はあなたを助け、解決策を手渡すだけではありませんでした。

select count(one_date), dayname(one_date) week_day from 

(select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) one_date from 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v) as all_days 

where one_date between '2016-10-01' and '2016-11-15' -- <---- DON'T HARDCODE THESE, JOIN YOUR TABLE TO THE all_days AND FILTER THE DAYS YOU WANT THAT WAY 
group by week_day 
having week_day in ('Sunday', 'Saturday'); 
0

これは長いクエリであり、パフォーマンスが低下する可能性があります。しかし、これはあなたに必要な出力

SELECT x.id,x.name,x.amount FROM 
    (SELECT name,amount,DATEDIFF(end_date,start_date)+1 AS totDays, 
     start_date AS day1,ADDDATE(start_date,1) AS day2, 
     ADDDATE(start_date,2) AS day3,ADDDATE(start_date,3) AS day4, 
     ADDDATE(start_date,4) AS day5,ADDDATE(start_date,5) AS day6, 
     end_date FROM your_table)X 
    WHERE x.totDays>5 OR (WEEKDAY(x.day1)>4 AND x.day1<=x.end_date) OR 
    (WEEKDAY(x.day2)>4 AND x.day2<=x.end_date) OR 
    (WEEKDAY(x.day3)>4 AND x.day3<=x.end_date) OR 
    (WEEKDAY(x.day4)>4 AND x.day4<=x.end_date) OR 
    (WEEKDAY(x.day5)>4 AND x.day5<=x.end_date) OR 
    (WEEKDAY(x.day6)>4 AND x.day6<=x.end_date); 

やメモ

SELECT name,amount FROM your_table WHERE 
    (DATEDIFF(end_date,start_date)+1) >5 OR 
    (WEEKDAY(start_date)>4 AND start_date<=end_date) OR 
    (WEEKDAY(ADDDATE(start_date,1))>4 AND ADDDATE(start_date,1)<=end_date) OR 
    (WEEKDAY(ADDDATE(start_date,2))>4 AND ADDDATE(start_date,2)<=end_date) OR 
    (WEEKDAY(ADDDATE(start_date,3))>4 AND ADDDATE(start_date,3)<=end_date) OR 
    (WEEKDAY(ADDDATE(start_date,4))>4 AND ADDDATE(start_date,4)<=end_date) OR 
    (WEEKDAY(ADDDATE(start_date,5))>4 AND ADDDATE(start_date,5)<=end_date); 

、これを試してみることができます。start_dateend_dateDATEDIFFが5より大きい場合

を、そして週末があるでしょう。 5までstart_date

end_dateとそれを比較し、出力のWEEKDAYが4より大きい場合、週末が存在するであろう。

0

あなたは(一緒に土曜日と日曜日)開始日と終了日の間の週末がある行を選択したい場合は、このクエリを使用することがあります。

select name, amount FROM your_table WHERE 
    datediff(end_date,start_date) > 6 
    or 
    (datediff(end_date,start_date)+weekday(start_date)>=6 
    and weekday(start_date)<>6); 

(END_DATE、START_DATE START_DATEとEND_DATE包括的なDateDiff関数を仮定すると、 )は1週間よりも多くの日数があれば、1週間の間に週末があると確信できます。日数が少なくなると、指定された開始曜日から始まる日数が週末をカバーするかどうかをチェックする必要がありますが、開始日が日曜日(6日後の日曜日から始まるのは土曜日ですが、これらの2つの週末の日は次々に繰り返されるわけではありません)。このクエリを使用することができますが、開始日と終了日との間に少なくとも1つの平日(土曜日または日曜日)がある場合、行を選択したい場合には

select name, amount FROM your_table WHERE 
    datediff(end_date,start_date)+weekday(start_date)>=5; 
関連する問題