মাইএসকিউএলে সপ্তাহে কীভাবে গ্রুপ করবেন?


92

ওরাকলের টেবিল সার্ভারটি একটি অন্তর্নির্মিত ফাংশন সরবরাহ করে TRUNC(timestamp,'DY'),। এই ফাংশনটি আগের রবিবার যে কোনও টাইমস্ট্যাম্পকে মধ্যরাতে রূপান্তর করে। মাইএসকিউএলে এটি করার সর্বোত্তম উপায় কী?

ওরাকল TRUNC(timestamp,'MM')এটির মাসের প্রথম দিনটিতে একটি টাইমস্ট্যাম্পকে মধ্যরাতে রূপান্তরিত করার প্রস্তাব দেয়। মাইএসকিউএল এ, এটি সহজবোধ্য:

TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))

তবে এই DATE_FORMATকৌশলটি কয়েক সপ্তাহ ধরে কাজ করবে না। আমি WEEK(timestamp)ফাংশন সম্পর্কে সচেতন , কিন্তু আমি সত্যিই বছরের মধ্যে সপ্তাহের সংখ্যা চাই না; এই জিনিসগুলি বহু বছরের কাজের জন্য।


আপনার মানে ট্রাঙ্ক (সিসডেট, 'ডাব্লু'), কাণ্ড নয় (সিসডেট, 'ডিওয়াই')
ডেভিড অ্যালড্রিজ

TRUNC(date, 'DY' )রবিবার শুরুর সাথে কয়েক সপ্তাহ পরে যায়। 'W'কমপক্ষে আমার সিস্টেমে সোমবারের সূচনা হয়।
ও জোন্স

উত্তর:


123

আপনি উভয় ব্যবহার করতে পারেন YEAR(timestamp)এবং WEEK(timestamp), এবং এই এক্সপ্রেশন উভয় ব্যবহার SELECTএবং GROUP BYদফা।

অতিরিক্ত মার্জিত নয়, তবে কার্যকরী ...

এবং অবশ্যই আপনি এই দুটি তারিখের অংশগুলি একক অভিব্যক্তিতেও একত্রিত করতে পারেন, যেমন কিছু

SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))

সম্পাদনা : মার্টিন যেমন উল্লেখ করেছেন আপনি YEARWEEK(mysqldatefield)ফাংশনটিও ব্যবহার করতে পারেন , যদিও এর আউটপুট উপরের দীর্ঘ সূত্রের মতো চক্ষু বান্ধব নয়।


2 সম্পাদনা করুন [3/2 বছর পরে!]: 0
YEARWEEK(mysqldatefield)চ্ছিক দ্বিতীয় আর্গুমেন্টের সাথে ( mode) হয় 0 বা 2 তে সেট করা সম্ভবত পুরো সপ্তাহের মধ্যে সমষ্টি করার সর্বোত্তম উপায় (যেমন 1 লা জানুয়ারীর মধ্যে যে সপ্তাহগুলিতে বিস্তৃত হয় সেগুলি সহ) যদি তা হয় কি পছন্দসই। YEAR() / WEEK()পদ্ধতির প্রাথমিকভাবে এই উত্তরটি প্রস্তাব বিভাজন প্রভাব যেমন জন্য সমষ্টিগত তথ্য আছে "straddling" সাবেক বছর এক, নতুন বছর সঙ্গে এক: সপ্তাহ দুই।
প্রতি বছর একটি পরিষ্কার-কাট, দুই আংশিক সপ্তাহ পর্যন্ত ব্যয় করে, উভয় প্রান্তে একটি প্রায়শই অ্যাকাউন্টিং ইত্যাদিতে পছন্দ হয় এবং এর জন্য YEAR() / WEEK()পদ্ধতির আরও ভাল।


12
YEARWEEK()একটি ফলাফল INT(6)যা আমি বিশ্বাস করি সাজানোর দ্রুত হতে হবে / দিয়ে দলে যোগ /
KCD

@ এমজেভি: দু'বছর একই সপ্তাহে ভাগ হলে কী হয়? এই 31-12-2012 থেকে 6-1-2013 পর্যন্ত (সোম থেকে সূর্যের) পছন্দ করুন। এই কোনো সমাধান আছে ?
হার্ডিক

@ হার্দিক: সম্পাদনা দেখুন ২. নিজের প্রয়োজনের উপর নির্ভর করে বছরের সেরা (এক) বছরের সেরা / প্রথম আংশিক সপ্তাহকে বিভক্ত করার পরিবর্তে যদি পুরো সপ্তাহ নিয়ে কাজ করতে পারে তবে একত্রিত করার জন্য সেরা বছর হতে পারে key
এমজেভি

@mjv এখানে যে জন্য আর একটি সমাধান লিংক
hardik

আমার টেবিলে যেমন ছিল "টাইমস্ট্যাম্প" কোনও পূর্ণসংখ্যা নয় তা নিশ্চিত করুন। উইক (টাইমস্ট্যাম্প) তারিখ / টাইমস্ট্যাম্প কলামের ধরণের বৈধ যুক্তি হিসাবে গ্রহণ করে
উসমান শওকত

37

উপরের গৃহীত উত্তরগুলি আমার পক্ষে কার্যকর হয়নি, কারণ এটি সপ্তাহিক বর্ণানুক্রমিক আদেশ অনুসারে আদেশ করেছিল, কালানুক্রমিক ক্রম নয়:

2012/1
2012/10
2012/11
...
2012/19
2012/2

এখানে সপ্তাহে আমার গণনা এবং দলবদ্ধকরণের সমাধান রয়েছে:

SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, 
       YEAR(date), WEEK(date), COUNT(*)
FROM column_name
GROUP BY week_name
ORDER BY YEAR(DATE) ASC, WEEK(date) ASC

উত্পন্ন:

YEAR/WEEK   YEAR   WEEK   COUNT
2011/51     2011    51      15
2011/52     2011    52      14
2012/1      2012    1       20
2012/2      2012    2       14
2012/3      2012    3       19
2012/4      2012    4       19

4
তারিখ অনুসারে অর্ডার দেওয়ার জন্য ORDER BY date ASC)
31:12

36

এটিকে বুঝিয়েছি ... এটি কিছুটা জটিল, কিন্তু এখানে।

FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

আর, যদি আপনার ব্যবসার নীতি বলে আপনার সপ্তাহ সোমবার শুরু, পরিবর্তন -1করার জন্য -2


সম্পাদনা করুন

বছর কেটে গেছে এবং অবশেষে আমি এটি লিখতে প্রায় পেয়েছি। http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/


@ অলি - পাঠযোগ্যতা সহায়তা করার জন্য আমি ডায়াফওইক () বা উইকডে () ব্যবহার করার বিষয়টি বিবেচনা করব।
মার্টিন ক্লেটনটন

4
মার্টিন, আমি এটি বিবেচনা করেছি এবং আবিষ্কার করেছি যে এই ফাংশনগুলি সোমবার-রবিবারের জন্য 0-6 থেকে চলে। আমার ব্যবসায়ের নিয়মগুলি বলছে যে সপ্তাহগুলি রবিবার 00:00 এ শুরু হয়, তাই উইকডেএ জিনিসগুলি কিছুটা কুৎসিত হয়। আপনি পাঠযোগ্যতার কথা ঠিক বলেছেন right
ও জোন্স

নিখুঁত! তোমাকে অনেক ধন্যবাদ!
জো চেং

4
দুর্দান্ত সমাধান এবং নিবন্ধ। ধন্যবাদ!
জেরেমি উইগগিনস

"সোমবার" মুষ্টির দিন হিসাবে সেট করার একটি উপায় আছে?
পেড্রো জোকেউন

25

আপনি YEARWEEK () ফাংশনটি ব্যবহার করে সংক্ষিপ্ত বছর এবং সপ্তাহের সংখ্যা (200945) পেতে পারেন । যদি আমি আপনার লক্ষ্যটি সঠিকভাবে বুঝতে পারি তবে এটি আপনাকে আপনার বহু-বছরের ডেটা গ্রুপ করতে সক্ষম করবে।

সপ্তাহের শুরুতে যদি আপনার সত্যিকারের টাইমস্ট্যাম্পের প্রয়োজন হয় তবে এটি কম সুন্দর:

DATE_SUB( field, INTERVAL DAYOFWEEK( field ) - 1 DAY )

মাসিক অর্ডার দেওয়ার জন্য, আপনি LAST_DAY () ফাংশনটি বিবেচনা করতে পারেন - বাছাই করা মাসের শেষ দিন অনুসারে হবে তবে এটি মাসের প্রথম দিন অনুসারে বাছাই করার সমতুল্য হওয়া উচিত ... তাই না?


4
+1 মার্টিন। দুহ আমার জন্য আমি বছরের পরের কথা ভুলে গিয়েছিলাম ... আমি কেবল এটি বেশি ব্যবহার করি না।
এমজেভি

4

এই নির্বাচন করুন:

DATE_FORMAT($yourDate, \'%X %V\') as week

এবং

group_by(week);

কিভাবে মাসের মধ্যে গ্রুপ করবেন
রবি তেজা

এটি অবিচ্ছিন্নভাবে ডেটা দখল করে না তবে কেবলমাত্র একটি নির্দিষ্ট তারিখের জন্য
চিক_কোড

2

আপনার যদি "সপ্তাহের সমাপ্তি" তারিখের প্রয়োজন হয় তবে এটিও কাজ করবে। এটি প্রতি সপ্তাহে রেকর্ডের সংখ্যা গণনা করবে। উদাহরণ: যদি (অন্তর্ভুক্ত) 1/2/2010 এবং 1/8/2010 এর মধ্যে তিনটি কাজের আদেশ তৈরি করা হয়েছিল এবং 5 টি (অন্তর্ভুক্ত) 1/9/2010 এবং 1/16/2010 এর মধ্যে তৈরি করা হয়েছিল এটি ফিরে আসবে:

3/8/2010
5 1/16/2010

আমার ডেটটাইম ক্ষেত্রটি কেটে ফেলার জন্য আমাকে অতিরিক্ত তারিখ () ফাংশনটি ব্যবহার করতে হয়েছিল।

SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending
FROM work_order wo
GROUP BY week_ending;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.