তারিখ ব্যাপ্তি থেকে দিন উত্পন্ন


135

আমি একটি ক্যোয়ারী চালাতে চাই

select ... as days where `date` is between '2010-01-20' and '2010-01-24'

এবং রিটার্ন ডেটা যেমন:

দিন
----------
2010-01-20
2010-01-21
2010-01-22
2010-01-23
2010-01-24

10
এই প্রশ্নের সাথে অন্য কোনও সমস্যা সংযুক্ত নেই। উপরের প্রশ্নটি হচ্ছে সমস্যা, এসকিউএল কোর্সকে দক্ষ করে তোলা।
পেন্টিয়াম

আপনার কি কেবল নির্বাচিত তারিখ-ব্যাপ্তির উপর ভিত্তি করে তারিখগুলির একটি অ্যারে দরকার?
ডেরেক আদায়ের

1
আপনাকে কোনও সমস্যা খুঁজে পেতে আমি কোনও ব্যবহারের কথা ভাবছি ... যদি আপনি কোনও টাস্ক পান তবে আপনার টেবিলে কিছু হারিয়ে যাওয়া রেকর্ড পূরণ করতে পারেন। এবং আপনাকে প্রতিদিনের জন্য একটি ক্যোয়ারী চালাতে হবে আমি এমন কিছু ভাবছিinsert into table select ... as days date between '' and ''
পেন্টিয়াম

13
এর ব্যবহারের উদাহরণ হ'ল পরিসংখ্যান তৈরি করা এবং আপনার কাছে কোনও ডেটা নেই এমন তারিখের জন্য একটি সারি অন্তর্ভুক্ত করা হবে। আপনি যদি গোষ্ঠীভিত্তিক কিছু কাজ করে থাকেন তবে এসকিউএল-এ সমস্ত তথ্য উত্পন্ন করা এবং আপনার ভাষার সাথে আপনার ডেটা ডাম্পিংয়ের পরিবর্তে আপনার প্রয়োজন মতো ফর্ম্যাটে যুক্ত করা এবং এটি লুপিং এবং আপনার যুক্ত করা শুরু করা আরও দ্রুততর হতে পারে বের করে দেয়।
Nanne

1
@ ন্যান ঠিক এই কারণেই কেন আমি এই প্রশ্নটি সংরক্ষণ করেছি। আমার উপরের ডেটাগুলিতে যোগ দিতে বামে থাকতে হবে যা নির্দিষ্ট তারিখের জন্য নাও থাকতে পারে।
জোশ ডিহল

উত্তর:


318

এই সমাধানটিতে কোনও লুপ, পদ্ধতি বা টেম্প টেবিল ব্যবহার করা হয় না । সাবকিউরিটি গত 10,000 দিনের তারিখগুলি উত্পন্ন করে এবং আপনার ইচ্ছামতো পিছনে বা এগিয়ে যেতে বাড়ানো যেতে পারে।

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a
where a.Date between '2010-01-20' and '2010-01-24' 

আউটপুট:

Date
----------
2010-01-24
2010-01-23
2010-01-22
2010-01-21
2010-01-20

পারফরম্যান্স নোটস

এটি এখানে পরীক্ষা করে দেখান , পারফরম্যান্সটি আশ্চর্যজনকভাবে ভাল: উপরের ক্যোয়ারীতে 0.0009 সেকেন্ড লাগে।

যদি আমরা প্রায় উত্পন্ন উত্পাদন subquery প্রসারিত। 100,000 সংখ্যা (এবং এভাবে প্রায় 274 বছরের তারিখের মূল্য), এটি 0.0458 সেকেন্ডে চলে।

ঘটনাচক্রে, এটি একটি খুব বহনযোগ্য প্রযুক্তি যা বেশিরভাগ ডাটাবেসের সাথে সামান্য সমন্বয়গুলি সহ কাজ করে।

এসকিউএল ফিডল উদাহরণ 1,000 দিন ফেরত returning


6
আপনি যদি বদলে UNIONযান তবে আপনি আরও ভাল পারফরম্যান্স দেখতে পাবেন UNION ALL- নকলের অস্তিত্ব নেই তা সরাতে এটি পরীক্ষা করতে সময় নষ্ট করছে। যদিও এটি সংঘবদ্ধ আইএমও - আপনি যদি ইউনিয়নগুলি ব্যবহার করে ফলাফল নির্ধারণ করতে যাচ্ছেন তবে কেন কেবল তারিখটি নির্দিষ্ট করে তা দিয়ে করা হবে না?
ওএমজি পনিজ

7
কেবল তারিখটি নির্দিষ্ট করে কেন এটি করা হবে না - কারণ উপরের পদ্ধতিটি আপনাকে স্বেচ্ছায় বড় আকারের সংখ্যা তৈরি করতে দেয় (এবং তারিখগুলি) যাতে কোনও টেবিল তৈরির প্রয়োজন হয় না, এটি আপনার পরামর্শ অনুসারে কঠোর কোডের জন্য বেদনাদায়ক হবে। স্পষ্টতই 5 তারিখের জন্য এটি ওভারকিল; তবে তারপরেও, আপনি যদি এমন কোনও টেবিলের বিপরীতে যোগ দিচ্ছেন যেখানে আপনি তারিখগুলি আগেই জানেন না, তবে কেবল সম্ভাব্য ন্যূনতম এবং সর্বাধিক মানগুলি, এটি উপলব্ধি করে।
রেডফিল্টার

2
আপনি ইতিমধ্যে তৈরি ইউনিয়ন বিবৃতিটির জায়গায় DATETIME ফাংশনটি ব্যবহার করা "বেদনাদায়ক"? এটি আপনার যুক্ত করার যুক্তিটির কোনও প্রয়োজনকে হ্রাস করে । অতএব - আপনি ক্যোয়ারিকে জটিল করে ফেলেছেন । ইউনিয়ন বিবৃতি, উভয় উপায়েই মাপা যায় না - একটি তারিখ বা সংখ্যা নির্দিষ্ট করে কে 20 বা 30 তারিখের সমন্বয় করতে আপডেট করতে চায়?
ওএমজি পনিজ 28'10

23
প্রশ্নের উত্তর দেখতে পারা সত্যিই খুব সুন্দর, এটি কীভাবে করা যায় বা করা উচিত নয় তা অন্তহীন মন্তব্য নয়। বেশিরভাগ জিনিসই করা যেতে পারে, এবং "উচিত" কেবলমাত্র প্রসঙ্গে অর্থবহ, যা সবার জন্য পৃথক। এই উত্তরটি আমাকে সহায়তা করেছিল, যদিও আমি বেশ ভালভাবেই অবগত আছি যে বেশিরভাগ পরিস্থিতিতে আরও ভাল উপায় রয়েছে।
জো

7
আপনারা যারা এই ক্যোয়ারিটি কাজ করতে পারবেন না: দয়া করে নিজেকে চড় মারুন এবং তারপরে 1000 টি তারিখ উত্পন্ন করে এই ক্যোয়ারি সম্পর্কে ওপি'র মন্তব্যটি পুনরায় পড়ুন। ২০১০ সাল থেকে ১০০০ দিনেরও বেশি সময় আগে, আপনাকে সেই অনুসারে কোয়েরিটি সামঞ্জস্য করতে হবে।
নোয়েল ব্যারন

32

দর্শনগুলি ব্যবহার করে এখানে আরও একটি প্রকরণ রয়েছে:

CREATE VIEW digits AS
  SELECT 0 AS digit UNION ALL
  SELECT 1 UNION ALL
  SELECT 2 UNION ALL
  SELECT 3 UNION ALL
  SELECT 4 UNION ALL
  SELECT 5 UNION ALL
  SELECT 6 UNION ALL
  SELECT 7 UNION ALL
  SELECT 8 UNION ALL
  SELECT 9;

CREATE VIEW numbers AS
  SELECT
    ones.digit + tens.digit * 10 + hundreds.digit * 100 + thousands.digit * 1000 AS number
  FROM
    digits as ones,
    digits as tens,
    digits as hundreds,
    digits as thousands;

CREATE VIEW dates AS
  SELECT
    SUBDATE(CURRENT_DATE(), number) AS date
  FROM
    numbers;

এবং তারপরে আপনি কেবল এটি করতে পারেন (দেখুন এটি কত মার্জিত?):

SELECT
  date
FROM
  dates
WHERE
  date BETWEEN '2010-01-20' AND '2010-01-24'
ORDER BY
  date

হালনাগাদ

এটি লক্ষণীয় যে আপনি কেবল বর্তমান তারিখ থেকে শুরু করে অতীতের তারিখগুলি তৈরি করতে সক্ষম হবেন । আপনি যদি কোনও ধরণের তারিখের সীমা তৈরি করতে চান (অতীত, ভবিষ্যত এবং এর মধ্যে), আপনাকে পরিবর্তে এই দৃশ্যটি ব্যবহার করতে হবে:

CREATE VIEW dates AS
  SELECT
    SUBDATE(CURRENT_DATE(), number) AS date
  FROM
    numbers
  UNION ALL
  SELECT
    ADDDATE(CURRENT_DATE(), number + 1) AS date
  FROM
    numbers;

1
এটি সব ক্ষেত্রে কাজ করে না। নির্বাচনের তারিখ থেকে তারিখগুলি কোথায় তারিখ '2014-12-01' এবং '2014-12-28' এর মধ্যে তারিখ অনুসারে
ভাসান্থ

3
গুড কল @ user927258। এটি কারণ datesউপরে উল্লিখিত প্রথম দর্শন বর্তমান তারিখ থেকে শুরু হওয়া তারিখগুলি গণনা করে, যার কারণে আপনি ভবিষ্যতে নির্ধারিত তারিখগুলি পুনরুদ্ধার করতে পারবেন না। @ রেডফিল্টার থেকে উত্তর একই ডিজাইনের ত্রুটি ভুগছে। যদিও আমি আমার উত্তরে একটি সংযুক্তি যুক্ত করেছি।
স্টাফেন

কিছু দর্শন ব্যবহার করা অবশ্যই প্রশ্নগুলি সহজতর করে এবং এটিকে পুনরায় ব্যবহারযোগ্য করে তোলে। যদিও তারা মূলত একই জিনিসটি করছে, সেগুলি সমস্ত UNIONএকক একটি এসকিউএল বিবৃতিতে অদ্ভুত দেখাচ্ছে।
স্টুয়ার্ট

24

স্বীকৃত উত্তর পোস্টগ্রিএসকিউএল ("এ" এর নিকটে বা কাছাকাছি সিনট্যাক্স ত্রুটি) এর জন্য কাজ করে না।

PostgreSQL এ আপনি যেভাবে করেন তা হ'ল generate_seriesফাংশন ব্যবহার করে, অর্থাত:

SELECT day::date
FROM generate_series('2010-01-20', '2010-01-24', INTERVAL '1 day') day;

    day
------------
 2010-01-20
 2010-01-21
 2010-01-22
 2010-01-23
 2010-01-24
(5 rows)

14

পুনরাবৃত্ত হওয়া সাধারণ টেবিল এক্সপ্রেশন (সিটিই) ব্যবহার করে আপনি তারিখগুলির একটি তালিকা তৈরি করতে পারেন, তারপরে এটি নির্বাচন করুন। স্পষ্টতই আপনি সাধারণত তিন মিলিয়ন তারিখ তৈরি করতে চান না, সুতরাং এটি কেবল সম্ভাবনার চিত্র তুলে ধরে। আপনি কেবল সিটিইর মধ্যে তারিখের সীমাটি সীমাবদ্ধ করতে পারেন এবং সিটিই ব্যবহার করে নির্বাচিত বিবৃতি থেকে যেখানে অনুচ্ছেদটি বাদ দিতে পারেন।

with [dates] as (
    select convert(datetime, '1753-01-01') as [date] --start
    union all
    select dateadd(day, 1, [date])
    from [dates]
    where [date] < '9999-12-31' --end
)
select [date]
from [dates]
where [date] between '2013-01-01' and '2013-12-31'
option (maxrecursion 0)

মাইক্রোসফ্ট এসকিউএল সার্ভার 2005-এ, সমস্ত সম্ভাব্য তারিখের সিটিই তালিকা তৈরি করতে সময় লেগেছিল 1:08। একশো বছরের উত্পাদন এক সেকেন্ডেরও কম সময় নেয়।


7

এমএসএসকিউএল ক্যোয়ারী

select datetable.Date 
from (
    select DATEADD(day,-(a.a + (10 * b.a) + (100 * c.a)),getdate()) AS Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) datetable
where datetable.Date between '2014-01-20' and '2014-01-24' 
order by datetable.Date DESC

আউটপুট

Date
-----
2014-01-23 12:35:25.250
2014-01-22 12:35:25.250
2014-01-21 12:35:25.250
2014-01-20 12:35:25.250

2
আমি যদি আরও কিছুটা স্ক্রোল করে থাকি ... দীর্ঘশ্বাস ফেললে। যাইহোক, আপনাকে ধন্যবাদ। আমি আমার সংস্করণে সময় সরানোর জন্য একটি ক্যাসেট (<এক্সপ্রেশন> হিসাবে তারিখ) যোগ করেছি। এছাড়াও যেখানে GETDATE () - 365 এবং GETDATE () এর মধ্যে তারিখ রয়েছে ... আপনি যদি আজ আপনার ক্যোয়ারী চালান তবে WHERE = P
রিকার্ডো সি

4

লুপ / ​​কার্সার ছাড়াই এটি করার জন্য পুরাতন স্কুল সমাধানটি একটি NUMBERSটেবিল তৈরি করা হয় , যার মানটি 1 থেকে শুরু হওয়া সহ একক পূর্ণসংখ্যা কলামে থাকে।

CREATE TABLE  `example`.`numbers` (
  `id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

আপনার প্রয়োজনীয়তাগুলি কভার করার জন্য আপনাকে পর্যাপ্ত রেকর্ড সহ টেবিলটি তৈরি করতে হবে:

INSERT INTO NUMBERS (id) VALUES (NULL);

একবার আপনার NUMBERSটেবিলটি থাকলে আপনি এটি ব্যবহার করতে পারেন:

SELECT x.start_date + INTERVAL n.id-1 DAY
  FROM NUMBERS n
  JOIN (SELECT STR_TO_DATE('2010-01-20', '%Y-%m-%d') AS start_date 
          FROM DUAL) x
 WHERE x.start_date + INTERVAL n.id-1 DAY <= '2010-01-24'

নিখুঁত নিম্ন প্রযুক্তির সমাধানটি হ'ল:

SELECT STR_TO_DATE('2010-01-20', '%Y-%m-%d')
 FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-21', '%Y-%m-%d')
 FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-22', '%Y-%m-%d')
 FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-23', '%Y-%m-%d')
 FROM DUAL
UNION ALL
SELECT STR_TO_DATE('2010-01-24', '%Y-%m-%d')
 FROM DUAL

আপনি এটি কি জন্য ব্যবহার করবেন?


বাম যোগদানের জন্য খেজুর বা সংখ্যাগুলির তালিকা তৈরি করতে। আপনি ডেটাতে ফাঁক রয়েছে তা দেখার জন্য আপনি এটি করতে পারেন, কারণ আপনি ক্রমসংক্রমিক তথ্যগুলির তালিকায় যোগ দিচ্ছেন - নাল মানগুলি যেখানে স্পষ্ট রয়েছে সেখানে তা স্পষ্ট করে দেবে।


1
DUALটেবিল একটি স্ট্যান্ড-ইন টেবিলে হিসাবে ব্যবহার করার জন্য ওরাকল এবং মাইএসকিউএল দ্বারা সমর্থিত FROMদফা। এটি বিদ্যমান নেই, এর থেকে মানগুলি নির্বাচন করা মানটি যা হয় তা ফিরে আসবে। ধারণাটি স্ট্যান্ড-ইন করার ছিল কারণ একটি নির্বাচনী ক্যোয়ারিতে FROMকমপক্ষে একটি সারণী নির্দিষ্ট করার জন্য একটি ধারা প্রয়োজন ।
ওএমজি পনিজ

1
আরডিবিএমএস তৈরি করার পরিবর্তে স্থায়ী সংখ্যা টেবিল তৈরি করার জন্য +1 আপনার প্রত্যেকবার প্রশ্নের দরকার পরে এটি তৈরি করুন। সহায়ক টেবিলগুলি মন্দ নয়, লোকেরা!
বেকন বিট

4

অ্যাক্সেস 2010 এর জন্য - একাধিক পদক্ষেপের প্রয়োজন; আমি উপরে পোস্ট করা একই প্যাটার্নটি অনুসরণ করেছি, তবে ভেবেছিলাম যে আমি অ্যাক্সেসের কাউকে সহায়তা করতে পারি। আমার জন্য দুর্দান্ত কাজ করেছে, আমাকে খেজুরের বীজযুক্ত টেবিল রাখতে হবে না।

ডুয়াল নামে একটি সারণী তৈরি করুন (ওরাকল ডুয়াল টেবিলটি কীভাবে কাজ করে তার সমান)

  • আইডি (অটো নাম্বার)
  • ডামি কলাম (পাঠ্য)
  • একটি সারির মান যুক্ত করুন (1, "ডামিরো")

"জিরোথ্রু 9 কিউ" নামে একটি কোয়েরি তৈরি করুন; ম্যানুয়ালি নিম্নলিখিত বাক্য গঠন লিখুন:

SELECT 0 AS a
FROM dual
UNION ALL
SELECT 1
FROM dual
UNION ALL
SELECT 2
FROM dual
UNION ALL
SELECT 3
FROM dual
UNION ALL
SELECT 4
FROM dual
UNION ALL
SELECT 5
FROM dual
UNION ALL
SELECT 6
FROM dual
UNION ALL
SELECT 7
FROM dual
UNION ALL
SELECT 8
FROM dual
UNION ALL
SELECT 9
FROM dual;

"টুডমিনাস 1 কেকিউ" নামে একটি কোয়েরি তৈরি করুন (আজকের আগের তারিখের জন্য); ম্যানুয়ালি নিম্নলিখিত বাক্য গঠন লিখুন:

SELECT date() - (a.a + (10 * b.a) + (100 * c.a)) AS MyDate
FROM
  (SELECT *
   FROM ZeroThru9Q) AS a,

  (SELECT *
   FROM ZeroThru9Q) AS b,

  (SELECT *
   FROM ZeroThru9Q) AS c

"টুডপ্লাস 1 কেকিউ" নামে একটি কোয়েরি তৈরি করুন (আজকের পরে তারিখের জন্য); ম্যানুয়ালি নিম্নলিখিত বাক্য গঠন লিখুন:

SELECT date() + (a.a + (10 * b.a) + (100 * c.a)) AS MyDate
FROM
  (SELECT *
   FROM ZeroThru9Q) AS a,

  (SELECT *
   FROM ZeroThru9Q) AS b,

  (SELECT *
   FROM ZeroThru9Q) AS c;

"টুডপ্লাসমিনুস 1 কেকিউ" নামে একটি ইউনিয়ন কোয়েরি তৈরি করুন (তারিখের জন্য +/- 1000 দিন):

SELECT MyDate
FROM TodayMinus1KQ
UNION
SELECT MyDate
FROM TodayPlus1KQ;

এখন আপনি ক্যোয়ারীটি ব্যবহার করতে পারেন:

SELECT MyDate
FROM TodayPlusMinus1KQ
WHERE MyDate BETWEEN #05/01/2014# and #05/30/2014#

3

প্রক্রিয়া + অস্থায়ী সারণী:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `days`(IN dateStart DATE, IN dateEnd DATE)
BEGIN

    CREATE TEMPORARY TABLE IF NOT EXISTS date_range (day DATE);

    WHILE dateStart <= dateEnd DO
      INSERT INTO date_range VALUES (dateStart);
      SET dateStart = DATE_ADD(dateStart, INTERVAL 1 DAY);
    END WHILE;

    SELECT * FROM date_range;
    DROP TEMPORARY TABLE IF EXISTS date_range;

END

3

thx পেন্টিয়াম 10 - আপনি আমাকে স্ট্যাকওভারফ্লোতে যোগ দিয়েছিলেন :) - এটি মিস্যাক্সেসে আমার পোর্টিং - মনে করুন এটি কোনও সংস্করণে কাজ করবে:

SELECT date_value
FROM (SELECT a.espr1+(10*b.espr1)+(100*c.espr1) AS integer_value,
dateadd("d",integer_value,dateserial([start_year], [start_month], [start_day])) as date_value
FROM (select * from 
    (
    select top 1 "0" as espr1 from MSysObjects
    union all
    select top 1 "1" as espr2 from MSysObjects
    union all
    select top 1 "2" as espr3 from MSysObjects
    union all
    select top 1 "3" as espr4 from MSysObjects
    union all
    select top 1 "4" as espr5 from MSysObjects
    union all
    select top 1 "5" as espr6 from MSysObjects
    union all
    select top 1 "6" as espr7 from MSysObjects
    union all
    select top 1 "7" as espr8 from MSysObjects
    union all
    select top 1 "8" as espr9 from MSysObjects
    union all
    select top 1 "9" as espr9 from MSysObjects
    ) as a,
    (
    select top 1 "0" as espr1 from MSysObjects
    union all
    select top 1 "1" as espr2 from MSysObjects
    union all
    select top 1 "2" as espr3 from MSysObjects
    union all
    select top 1 "3" as espr4 from MSysObjects
    union all
    select top 1 "4" as espr5 from MSysObjects
    union all
    select top 1 "5" as espr6 from MSysObjects
    union all
    select top 1 "6" as espr7 from MSysObjects
    union all
    select top 1 "7" as espr8 from MSysObjects
    union all
    select top 1 "8" as espr9 from MSysObjects
    union all
    select top 1 "9" as espr9 from MSysObjects
    ) as b,
    (
    select top 1 "0" as espr1 from MSysObjects
    union all
    select top 1 "1" as espr2 from MSysObjects
    union all
    select top 1 "2" as espr3 from MSysObjects
    union all
    select top 1 "3" as espr4 from MSysObjects
    union all
    select top 1 "4" as espr5 from MSysObjects
    union all
    select top 1 "5" as espr6 from MSysObjects
    union all
    select top 1 "6" as espr7 from MSysObjects
    union all
    select top 1 "7" as espr8 from MSysObjects
    union all
    select top 1 "8" as espr9 from MSysObjects
    union all
    select top 1 "9" as espr9 from MSysObjects
    ) as c   
)  as d) 
WHERE date_value 
between dateserial([start_year], [start_month], [start_day]) 
and dateserial([end_year], [end_month], [end_day]);

রেফারেন্সড এমএসআইওবজেক্টস কেবল 'কারণ অ্যাক্সেসের জন্য একটি টেবিল কাউন্টিনের প্রয়োজন' কমপক্ষে একটি রেকর্ডে - কমপক্ষে 1 রেকর্ডযুক্ত যে কোনও টেবিলটি করবে।


2

ইতিমধ্যে প্রদত্ত অনেক চমত্কার উত্তরগুলিতে যেমন বলা হয়েছে (বা কমপক্ষে ইঙ্গিত করা হয়েছে), আপনার সাথে কাজ করার জন্য সংখ্যার সেট থাকলেই এই সমস্যাটি সহজেই সমাধান হয়ে যায়।

দ্রষ্টব্য: নিম্নলিখিতটি টি-এসকিউএল কিন্তু এটি কেবলমাত্র ইতিমধ্যে এখানে এবং বৃহত্তর ইন্টারনেটে উল্লিখিত সাধারণ ধারণাগুলির আমার বিশেষ প্রয়োগ। কোডটিকে আপনার পছন্দের উপভাষায় রূপান্তর করা তুলনামূলকভাবে সহজ হওয়া উচিত।

কিভাবে? এই প্রশ্নটি বিবেচনা করুন:

SELECT DATEADD(d, N, '0001-01-22')
FROM Numbers -- A table containing the numbers 0 through N
WHERE N <= 5;

উপরের তারিখের সীমাটি 1/22/0001 - 1/27/0001 উত্পাদন করে এবং অত্যন্ত তুচ্ছ। আছে: উপরে ক্যোয়ারীতে তথ্য 2 চাবি টুকরা শুরুর তারিখ এর 0001-01-22এবং অফসেট এর 5। যদি আমরা এই দুটি টুকরো তথ্য একত্রিত করি তবে স্পষ্টতই আমাদের শেষের তারিখ রয়েছে। সুতরাং, দুটি তারিখ দেওয়া, একটি পরিসীমা উত্পন্ন করে এভাবে ভেঙে ফেলা যায়:

  • দুটি প্রদত্ত তারিখ (অফসেট) এর মধ্যে পার্থক্যটি সন্ধান করুন, সহজ:

    -- Returns 125 SELECT ABS(DATEDIFF(d, '2014-08-22', '2014-12-25'))

    ABS()এখানে ব্যবহার নিশ্চিত করে যে তারিখের আদেশটি অপ্রাসঙ্গিক।

  • সীমিত সংখ্যার সেট তৈরি করুন, খুব সহজ:

    -- Returns the numbers 0-2 SELECT N = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 FROM(SELECT 'A' AS S UNION ALL SELECT 'A' UNION ALL SELECT 'A')

    লক্ষ্য করুন যে আমরা FROMএখানে কী নির্বাচন করছি তা আসলে আমাদের যত্ন নেই। আমাদের কেবলমাত্র এটির সাথে কাজ করার জন্য একটি সেট প্রয়োজন যাতে আমরা এটিতে সারিগুলির সংখ্যা গণনা করি। আমি ব্যক্তিগতভাবে একটি টিভিএফ ব্যবহার করি, কেউ কেউ সিটিই ব্যবহার করেন, অন্যরা পরিবর্তে একটি সংখ্যা টেবিল ব্যবহার করেন, আপনি ধারণাটি পান get আপনি যে বুঝতে পারছেন এমন সর্বাধিক পারফরম্যান্স সমাধানটি ব্যবহার করার পক্ষে আমি সমর্থন জানাচ্ছি।

এই দুটি পদ্ধতির সংমিশ্রণ আমাদের সমস্যার সমাধান করবে:

DECLARE @date1 DATE = '9001-11-21';
DECLARE @date2 DATE = '9001-11-23';

SELECT D = DATEADD(d, N, @date1)
FROM (
    SELECT N = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1
    FROM (SELECT 'A' AS S UNION ALL SELECT 'A' UNION ALL SELECT 'A') S
) Numbers
WHERE N <= ABS(DATEDIFF(d, @date1, @date2));

উপরের উদাহরণটি হ'ল ভয়ঙ্কর কোড তবে এটি দেখায় যে কীভাবে সবকিছু একত্রিত হয়।

আরও মজা

আমার এই ধরণের জিনিসটি অনেক বেশি করা দরকার তাই আমি যুক্তিটি দুটি টিভিএফের মধ্যে আবদ্ধ করে ফেললাম। প্রথমটি বিভিন্ন সংখ্যার পরিসীমা উত্পন্ন করে এবং দ্বিতীয়টি কার্যকারিতাটি বিভিন্ন তারিখ তৈরি করতে ব্যবহার করে। গণিতটি হ'ল এটি নিশ্চিত করা যে ইনপুট অর্ডারটি কোনও বিষয় নয় এবং কারণ আমি এতে উপলব্ধ সংখ্যার সম্পূর্ণ পরিসরটি ব্যবহার করতে চেয়েছিলাম GenerateRangeSmallInt

নিম্নলিখিত ফাংশনটি 65536 তারিখের সর্বাধিক পরিসীমা ফেরত দিতে সিপিইউয়ের 16 ডলার সময় নেয়।

CREATE FUNCTION dbo.GenerateRangeDate (   
    @date1 DATE,   
    @date2 DATE   
)   
RETURNS TABLE
WITH SCHEMABINDING   
AS   
RETURN (
    SELECT D = DATEADD(d, N + 32768, CASE WHEN @date1 <= @date2 THEN @date1 ELSE @date2 END)
    FROM dbo.GenerateRangeSmallInt(-32768, ABS(DATEDIFF(d, @date1, @date2)) - 32768)
);

GO

CREATE FUNCTION dbo.GenerateRangeSmallInt (
    @num1 SMALLINT = -32768
  , @num2 SMALLINT = 32767
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (
    WITH Numbers(N) AS (
        SELECT N FROM(VALUES
            (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 16
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 32
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 48
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 64
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 80
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 96
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 112
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 128
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 144
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 160
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 176
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 192
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 208
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 224
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 240
          , (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) -- 256
        ) V (N)
    )
    SELECT TOP(ABS(CAST(@num1 AS INT) - CAST(@num2 AS INT)) + 1)
           N = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + CASE WHEN @num1 <= @num2 THEN @num1 ELSE @num2 END - 1
    FROM Numbers A
       , Numbers B
);

2

এটা চেষ্টা কর.

SELECT TO_DATE('20160210','yyyymmdd') - 1 + LEVEL AS start_day 
from DUAL
connect by level <= (TO_DATE('20160228','yyyymmdd') + 1) - TO_DATE('20160210','yyyymmdd') ;

2

আপনি তারিখের সীমা পেতে চান।

আপনার উদাহরণে আপনি '2010-01-20' এবং '2010-01-24' এর মধ্যে তারিখগুলি পেতে চান

সম্ভাব্য সমাধান:

 select date_add('2010-01-20', interval row day) from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
    (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
    (SELECT @row:=-1) r
 ) sequence
 where date_add('2010-01-20', interval row day) <= '2010-01-24'

ব্যাখ্যা

মাইএসকিউএলের একটি ডেট_অ্যাড ফাংশন রয়েছে

select date_add('2010-01-20', interval 1 day)

তোমাকে দিবে

2010-01-21

Datediff ফাংশন আপনি এই পুনরাবৃত্তি করতে চাই দেওয়া হবে তা আপনি বুঝতে পারবেন

select datediff('2010-01-24', '2010-01-20')

যা ফিরে আসে

 4

একটি তারিখের পরিসরে তারিখগুলির তালিকা পাওয়া নিখরচায় পূর্ণসংখ্যার ক্রম তৈরি করে দেখুন মাইএসকিউএলে একটি পূর্ণসংখ্যার ক্রম তৈরি করে

এখানে সর্বাধিক উত্সাহিত উত্তরের ভিত্তিতে https://stackoverflow.com/a/2652051/1497139 এর অনুরূপ পন্থা গ্রহণ করা হয়েছে :

SELECT @row := @row + 1 as row FROM 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
(SELECT @row:=0) r
limit 4

যার ফলস্বরূপ হবে

row
1.0
2.0
3.0
4.0

প্রদত্ত শুরুর তারিখ থেকে তারিখের তালিকা তৈরি করতে এখন সারিগুলি ব্যবহার করা যেতে পারে। শুরুর তারিখটি অন্তর্ভুক্ত করতে আমরা সারি -1 দিয়ে শুরু করব;

select date_add('2010-01-20', interval row day) from
 ( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
    (SELECT @row:=-1) r
 ) sequence
 where date_add('2010-01-20', interval row day) <= '2010-01-24'

1

যদি আপনার আরও কয়েক দিনের প্রয়োজন হয় তবে আপনার একটি টেবিলের প্রয়োজন।

মাইএসকিএলে একটি তারিখের সীমা তৈরি করুন

তারপর,

select from days.day, count(mytable.field) as fields from days left join mytable on day=date where date between x and y;

3
উপরের জবাবটির কোনও টেবিলের প্রয়োজন নেই এবং সমাধান সরবরাহ করে আপনি কেন এটি পোস্ট করেছেন?
পেন্টিয়াম

1

দুটি তারিখের ক্ষেত্রের মধ্যে তারিখ তৈরি করুন

আপনি যদি এসকিউএল সিটিই কোয়েরি সম্পর্কে সচেতন হন তবে এই সমাধান আপনাকে আপনার প্রশ্ন সমাধান করতে সহায়তা করবে

এখানে উদাহরণ

আমাদের একটি টেবিলে খেজুর রয়েছে

সারণীর নাম: "টেস্টডেট"

STARTDATE   ENDDATE
10/24/2012  10/24/2012
10/27/2012  10/29/2012
10/30/2012  10/30/2012

ফলাফল প্রয়োজন:

STARTDATE
10/24/2012
10/27/2012
10/28/2012
10/29/2012
10/30/2012

সমাধান:

WITH CTE AS
  (SELECT DISTINCT convert(varchar(10),StartTime, 101) AS StartTime,
                   datediff(dd,StartTime, endTime) AS diff
   FROM dbo.testdate
   UNION ALL SELECT StartTime,
                    diff - 1 AS diff
   FROM CTE
   WHERE diff<> 0)
SELECT DISTINCT DateAdd(dd,diff, StartTime) AS StartTime
FROM CTE

ব্যাখ্যা: সিটিই রিকার্সি কোয়েরি ব্যাখ্যা

  • ক্যোয়ারীর প্রথম অংশ:

    SELECT DISTINCT convert(varchar(10), StartTime, 101) AS StartTime, datediff(dd, StartTime, endTime) AS diff FROM dbo.testdate

    ব্যাখ্যা: প্রথম কলামটি "শুরুর তারিখ", দ্বিতীয় কলামটি দিনের শুরুতে এবং শেষের তারিখের পার্থক্য এবং এটি "ডিফ" কলাম হিসাবে বিবেচিত হবে

  • প্রশ্নের দ্বিতীয় অংশ:

    UNION ALL SELECT StartTime, diff-1 AS diff FROM CTE WHERE diff<>0

    ব্যাখ্যা: ইউনিয়ন সবাই উপরের প্রশ্নের সাথে উত্তীর্ণ হবে ফলাফল যতক্ষণ না বাতিল হয়, সুতরাং "স্টার্টটাইম" ফলাফল উত্পন্ন সিটিই কোয়েরি থেকে প্রাপ্ত হয় এবং ভিন্নতা থেকে হ্রাস পায় - 1, সুতরাং এটির চেহারা 3, 2 এবং 1 এর মতো হয় 0 পর্যন্ত

উদাহরণ স্বরূপ

STARTDATE   DIFF
10/24/2012  0
10/27/2012  0
10/27/2012  1
10/27/2012  2
10/30/2012  0

ফলাফলের বিশদকরণ

STARTDATE       Specification
10/24/2012  --> From Record 1
10/27/2012  --> From Record 2
10/27/2012  --> From Record 2
10/27/2012  --> From Record 2
10/30/2012  --> From Record 3
  • প্রশ্নের তৃতীয় অংশ

    SELECT DISTINCT DateAdd(dd,diff, StartTime) AS StartTime FROM CTE

    এটি "স্টার্টেটে" দিনটিকে "ডিফফ" যুক্ত করবে সুতরাং ফলাফলটি নীচের মতো হওয়া উচিত

ফলাফল

STARTDATE
10/24/2012
10/27/2012
10/28/2012
10/29/2012
10/30/2012

1

গৃহীত উত্তরের চেয়ে কম, একই ধারণা:

(SELECT TRIM('2016-01-05' + INTERVAL a + b DAY) date
FROM
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3
UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9 ) d,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20
UNION SELECT 30 UNION SELECT 40) m
WHERE '2016-01-05' + INTERVAL a + b DAY  <=  '2016-01-21')

1

যে কেউ এটিকে সংরক্ষিত দর্শন হিসাবে চান (মাইএসকিউএল ভিউগুলিতে নেস্টেড নির্বাচিত বিবৃতিগুলি সমর্থন করে না):

create view zero_to_nine as
    select 0 as n union all 
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5 union all 
    select 6 union all 
    select 7 union all 
    select 8 union all 
    select 9;

create view date_range as
    select curdate() - INTERVAL (a.n + (10 * b.n) + (100 * c.n)) DAY as date
    from zero_to_nine as a
    cross join zero_to_nine as b
    cross join zero_to_nine as c;

আপনি তারপর করতে পারেন

select * from date_range

পেতে

date
---
2017-06-06
2017-06-05
2017-06-04
2017-06-03
2017-06-02
...

1

মারিয়াডিবি> = 10.3 এবং মাইএসকিউএল> = 8.0 এ নতুন পুনরাবৃত্ত (সাধারণ টেবিল এক্সপ্রেশন) কার্যকারিতা ব্যবহার করে মার্জিত সমাধান।

WITH RECURSIVE t as (
    select '2019-01-01' as dt
  UNION
    SELECT DATE_ADD(t.dt, INTERVAL 1 DAY) FROM t WHERE DATE_ADD(t.dt, INTERVAL 1 DAY) <= '2019-04-30'
)
select * FROM t;

উপরেরগুলি '2019-01-01' এবং '2019-04-30' এর মধ্যে তারিখের একটি সারণী দেয়। এটি শালীনভাবে দ্রুতও হয়। 1000 বছরের মূল্যবান তারিখগুলি (~ 365,000 দিন) ফিরিয়ে দেওয়া আমার মেশিনে প্রায় 400ms সময় নেয়।


1

উড়ে যাওয়ার জন্য এই তারিখগুলি তৈরি করা ভাল ধারণা। তবে আমি বেশ বড় পরিসরে এটি করতে নিজেকে স্বাচ্ছন্দ্য বোধ করি না তাই আমি নিম্নলিখিত সমাধানটি দিয়ে শেষ করেছি:

  1. একটি টেবিল তৈরি করেছেন "তারিখ সংখ্যা" যা তারিখ গণনার জন্য ব্যবহৃত সংখ্যা ধারণ করবে:
CREATE TABLE DatesNumbers (
    i MEDIUMINT NOT NULL,
    PRIMARY KEY (i)
)
COMMENT='Used by Dates view'
;
  1. উপরের কৌশলগুলি -59999 থেকে 40000 পর্যন্ত সংখ্যা সহ টেবিলটিকে জনবহুল করে তোলে This
INSERT INTO DatesNumbers
SELECT 
    a.i + (10 * b.i) + (100 * c.i) + (1000 * d.i) + (10000 * e.i) - 59999 AS i
FROM 
  (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a,
  (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b,
  (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c,
  (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d,
  (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
;
  1. "তারিখ" একটি দর্শন তৈরি করেছেন:
SELECT
      i,
      CURRENT_DATE() + INTERVAL i DAY AS Date
FROM
    DatesNumbers

এটাই.

  • (+) প্রশ্নগুলি পড়া সহজ
  • (+) ফ্লাই সংখ্যা প্রজন্মে নেই
  • (+) অতীতে এবং ভবিষ্যতে তারিখ দেয় এবং পোস্টের মতো এটির জন্য কোনও ইউনিয়ন নেই
  • (+) "অতীতে কেবল" বা "ভবিষ্যতে কেবল" তারিখগুলি ফিল্টার করা যেতে পারে WHERE i < 0বা ব্যবহার করেWHERE i > 0 (পিকে)
  • (-) 'অস্থায়ী' সারণী ও দর্শন ব্যবহার করা হয়

0

ঠিক আছে .. এটি চেষ্টা করুন: http://www.devshed.com/c/a/MySQL/Delving-Diper-into-MySQL-50/
http://dev.mysql.com/doc/refman/5.0/en/ লুপ-বিবৃতি।
html http://www.roseindia.net/sql/mysql-example/mysql-loop.shtml

এটি ব্যবহার করুন, বলুন, একটি টেম্প টেবিল তৈরি করুন এবং তারপরে টেম্প টেবিলের উপর একটি নির্বাচন করুন *। অথবা ফলাফলগুলি একবারে আউটপুট করুন।
আপনি যা বলতে চান সেটি একটি নির্বাচনী বিবৃতি দিয়ে সম্পন্ন করা যায় না , তবে এটি মাইএসকিউএল সম্পর্কিত নির্দিষ্ট জিনিসগুলির সাথে কার্যকর হতে পারে।
তারপরে, সম্ভবত আপনার কার্সারগুলি দরকার: http://dev.mysql.com/doc/refman/5.0/en/cursors.html


0

ওরাকলের জন্য, আমার সমাধানটি হ'ল:

select trunc(sysdate-dayincrement, 'DD') 
  from dual, (select level as dayincrement 
                from dual connect by level <= 30)

সিসডেট নির্দিষ্ট তারিখে পরিবর্তন করা যেতে পারে এবং আরও তারিখ দেওয়ার জন্য স্তর সংখ্যা পরিবর্তন করা যেতে পারে।


0

আপনি যদি দুটি তারিখের মধ্যে তারিখের তালিকাটি চান:

create table #dates ([date] smalldatetime)
while @since < @to
begin
     insert into #dates(dateadd(day,1,@since))
     set @since = dateadd(day,1,@since)
end
select [date] from #dates

* ফ্রিডল এখানে: http://sqlfiddle.com/#!6/9eecb/3469


0
set language  'SPANISH'
DECLARE @table table(fechaDesde datetime , fechaHasta datetime ) 
INSERT @table VALUES('20151231' , '20161231');
WITH x AS 
    (
        SELECT   DATEADD( m , 1 ,fechaDesde ) as fecha  FROM @table
        UNION ALL
        SELECT  DATEADD( m , 1 ,fecha )
        FROM @table t INNER JOIN x ON  DATEADD( m , 1 ,x.fecha ) <= t.fechaHasta
    )
SELECT LEFT( CONVERT( VARCHAR, fecha , 112 ) , 6 ) as Periodo_Id 
,DATEPART ( dd, DATEADD(dd,-(DAY(fecha)-1),fecha)) Num_Dia_Inicio
,DATEADD(dd,-(DAY(fecha)-1),fecha) Fecha_Inicio
,DATEPART ( mm , fecha ) Mes_Id
,DATEPART ( yy , fecha ) Anio
,DATEPART ( dd, DATEADD(dd,-(DAY(DATEADD(mm,1,fecha))),DATEADD(mm,1,fecha))) Num_Dia_Fin
,DATEADD(dd,-(DAY(DATEADD(mm,1,fecha))),DATEADD(mm,1,fecha)) ultimoDia
,datename(MONTH, fecha) mes
,'Q' + convert(varchar(10),  DATEPART(QUARTER, fecha)) Trimestre_Name
FROM x 
OPTION(MAXRECURSION 0)

0
DELIMITER $$
CREATE PROCEDURE GenerateRangeDates(IN dateStart DATE, IN dateEnd DATE)
BEGIN

    CREATE TEMPORARY TABLE IF NOT EXISTS dates (day DATE);

    loopDate: LOOP
        INSERT INTO dates(day) VALUES (dateStart); 
        SET dateStart = DATE_ADD(dateStart, INTERVAL 1 DAY);

        IF dateStart <= dateEnd 
            THEN ITERATE loopDate;
            ELSE LEAVE loopDate;
        END IF;
    END LOOP loopDate;

    SELECT day FROM dates;
    DROP TEMPORARY TABLE IF EXISTS dates;

END 
$$

-- Call procedure
call GenerateRangeDates( 
        now() - INTERVAL 40 DAY,
        now()
    );

0

SQLite RedFilters শীর্ষ সমাধান সংস্করণ

select d.Date
from (
    select 
    date(julianday('2010-01-20') + (a.a + (10 * b.a) + (100 * c.a))) as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) d
where 
d.Date between '2010-01-20' and '2010-01-24' 
order by d.Date

0

কাজের দিন সঙ্গে সম্পর্কের উন্নতি সাধন একটি একটি কাস্টম ছুটির দিন টেবিল যোগদান মাইক্রোসফট এমএস স্কুয়েল 2012 powerpivot তারিখ টেবিলের জন্য https://gist.github.com/josy1024/cb1487d66d9e0ccbd420bc4a23b6e90e

with [dates] as (
    select convert(datetime, '2016-01-01') as [date] --start
    union all
    select dateadd(day, 1, [date])
    from [dates]
    where [date] < '2018-01-01' --end
)
select [date]
, DATEPART (dw,[date]) as Wochentag
, (select holidayname from holidaytable 
where holidaytable.hdate = [date]) 
as Feiertag
from [dates]
where [date] between '2016-01-01' and '2016-31-12'
option (maxrecursion 0)

0
WITH
  Digits AS (SELECT 0 D 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),
  Dates AS (SELECT adddate('1970-01-01',t4.d*10000 + t3.d*1000 + t2.d*100 + t1.d*10 +t0.d) AS date FROM Digits AS t0, Digits AS t1, Digits AS t2, Digits AS t3, Digits AS t4)
SELECT * FROM Dates WHERE date BETWEEN '2017-01-01' AND '2017-12-31'

0

দিনের চেয়ে আলাদা টাইমস্ট্যামপ সহ ক্যালেন্ডার সারণী তৈরি করতে একটি পদ্ধতিও তৈরি করতে পারে আপনি যদি প্রতি ত্রৈমাসিকের জন্য একটি টেবিল চান

যেমন

2019-01-22 08:45:00
2019-01-22 09:00:00
2019-01-22 09:15:00
2019-01-22 09:30:00
2019-01-22 09:45:00
2019-01-22 10:00:00

তুমি ব্যবহার করতে পার

CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_calendar_table`()
BEGIN

select unix_timestamp('2014-01-01 00:00:00') into @startts;
select unix_timestamp('2025-01-01 00:00:00') into @endts;

if ( @startts < @endts ) then

    DROP TEMPORARY TABLE IF EXISTS calendar_table_tmp;

    CREATE TEMPORARY TABLE calendar_table_tmp (ts int, dt datetime); 

    WHILE ( @startts < @endts)
        DO 
        SET @startts = @startts + 900;
        INSERT calendar_table_tmp VALUES (@startts, from_unixtime(@startts));
    END WHILE;

END if;

END

এবং তারপরে হেরফের করুন

select ts, dt from calendar_table_tmp;

এটি আপনাকেও টিএস দেয়

'1548143100', '2019-01-22 08:45:00'
'1548144000', '2019-01-22 09:00:00'
'1548144900', '2019-01-22 09:15:00'
'1548145800', '2019-01-22 09:30:00'
'1548146700', '2019-01-22 09:45:00'
'1548147600', '2019-01-22 10:00:00'

এখান থেকে আপনি অন্যান্য তথ্য যুক্ত করতে শুরু করতে পারেন

select ts, dt, weekday(dt) as wd from calendar_table_tmp;

বা টেবিল স্টেটমেন্ট তৈরি করে একটি বাস্তব টেবিল তৈরি করুন


0

AWS MySQL এ কাজ করে এমন আরও জেনেরিক উত্তর।

select datetable.Date
from (
    select date_format(adddate(now(),-(a.a + (10 * b.a) + (100 * c.a))),'%Y-%m-%d') AS Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) datetable
where datetable.Date between now() - INTERVAL 14 Day and Now()
order by datetable.Date DESC

-1

মাইএসকিএল ৮.০.১ এবং মারিয়্যাডবি 10.2.2 এর পুনরাবৃত্ত সাধারণ টেবিল এক্সপ্রেশন ব্যবহারের জন্য আরও একটি সমাধান:

with recursive dates as (
    select '2010-01-20' as date
    union all
    select date + interval 1 day from dates where date < '2010-01-24'
)
select * from dates;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.