ঘন্টা বা 10 মিনিটের দ্বারা সময়কে কীভাবে গ্রুপ করবেন


167

আমি যখন করি পছন্দ করি

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date]

আমি কীভাবে গ্রুপ পিরিয়ড নির্দিষ্ট করতে পারি?

এমএস এসকিউএল ২০০৮

২ য় সম্পাদনা

আমি চেষ্টা করছি

SELECT MIN([Date]) AS RecT, AVG(Value)
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY (DATEPART(MINUTE, [Date]) / 10)
  ORDER BY RecT

% 10/10 থেকে পরিবর্তন করা কি মিলিসেকেন্ড ছাড়া ডেট আউটপুট তৈরি করা সম্ভব?

উত্তর:


213

অবশেষে সঙ্গে সম্পন্ন

GROUP BY
DATEPART(YEAR, DT.[Date]),
DATEPART(MONTH, DT.[Date]),
DATEPART(DAY, DT.[Date]),
DATEPART(HOUR, DT.[Date]),
(DATEPART(MINUTE, DT.[Date]) / 10)

11
আমি এটি তৈরি করেছি ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5, যাতে আমি যখন ডেটা দেখি তখন এটি নিকটতম সময়ের স্লটের সাথে সম্পর্কিত হয়
hdost

7
বছর, মাস এবং দিন সরল করা যেতে পারে DATE(DT.[Date])

@ কিলান আমার পক্ষে কাজ করে না - তবে কনভার্ট (তারিখ, ডিটি। [তারিখ]) কাজ করে।
ড্যান পারসনসন

datepart(hour, workingPolicy.workingHours)/2.0দেওয়ার 1.5সময় datepart(hour, '1900-01-01 09:00:30.000')/2.0দেয় 4.5, কেন বুঝতে পারছি না? নোট: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 । দয়া করে সহায়তা করুন
affanBajwa

65

আমি পার্টিতে বেশ দেরি করেছি, তবে এটি বিদ্যমান উত্তরের কোনওটিতে উপস্থিত হয় না:

GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
  • 10এবং MINUTEপদ যেকোন নম্বরে পরিবর্তন করা যাবে এবং DATEPARTযথাক্রমে।
  • এটি একটি DATETIMEমান, যার অর্থ:
    • এটি দীর্ঘ সময়ের ব্যবধানে সূক্ষ্মভাবে কাজ করে। (বছরের মধ্যে কোনও সংঘর্ষ নেই।)
    • SELECTবিবৃতিতে এটি অন্তর্ভুক্ত করা আপনার আউটপুটটিকে আপনার নির্দিষ্ট স্তরে ছাঁটাই সুন্দর আউটপুট সহ একটি কলাম দেবে।
  • '2000'এসকিউএল তারিখের গণিত সম্পাদন করবে এমন একটি "অ্যাঙ্কর তারিখ"। জেরোনহ নীচে আবিষ্কার করেছেন যে আপনি 0সাম্প্রতিক তারিখগুলি সেকেন্ড বা মিলিসেকেন্ড অনুসারে গোষ্ঠীভুক্ত করার সময় পূর্ববর্তী অ্যাঙ্কর ( ) এর সাথে একটি পূর্ণসংখ্যার ওভারফ্লোয়ের মুখোমুখি হন ।
SELECT   DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
                                                               AS [date_truncated],
         COUNT(*) AS [records_in_interval],
         AVG(aa.[value]) AS [average_value]
FROM     [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]

যদি আপনার ডেটা কয়েক শতাব্দী ধরে ছড়িয়ে থাকে, second দ্বিতীয়- বা মিলিসেকেন্ড গোষ্ঠীকরণের জন্য একটি একক অ্যাঙ্কর ডেট ব্যবহার করা এখনও উপচে পড়বে encounter যদি এটি হয়ে থাকে, আপনি প্রতিটি সারিটিকে তার নিজস্ব তারিখের মধ্যরাতের সাথে তুলনা করে অ্যাঙ্কর করতে বলতে পারেন:

  • এটি যেখানে প্রদর্শিত হবে DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)তার পরিবর্তে ব্যবহার করুন '2000'। আপনার ক্যোয়ারী সম্পূর্ণ অপঠনযোগ্য হবে, তবে এটি কার্যকর হবে।

  • বিকল্প CONVERT(DATETIME, CONVERT(DATE, aa.[date]))হিসাবে প্রতিস্থাপন হতে পারে ।

2 32 ≈ 4.29E + + 9, তাই যদি আপনার DATEPARTহয় SECOND, আপনি 4.3 বিলিয়ন সেকেন্ড উভয় পাশে পাওয়া, অথবা "নোঙ্গর ± 136 বছর।" একইভাবে, 2 32 মিলিসেকেন্ডগুলি ≈ 49.7 দিন।
Your যদি আপনার ডেটাটি শতাব্দী বা সহস্রাব্দিতে ছড়িয়ে পড়ে এবং এখনও দ্বিতীয় বা মিলিসেকেন্ডের সাথে সঠিক হয় ... অভিনন্দন! আপনি যা করছেন, তা চালিয়ে যান।


একটি নির্দিষ্ট শুরু তারিখ থেকে এটি করা সম্ভব হবে?
পাইল্যান্ডার

1
নিবন্ধন করুন শুধু একটি whereশর্ত আগে group by
মাইকেল - ক্লে শির্কি

2
আমি দেখি. সুতরাং এটি কি / 20 * 2020 মিনিটের ব্যবধানে ডেটা সংগ্রহের সমান হয়ে উঠবে? দুঃখিত, আমি এখনই গণিতে লড়াই করছি।
উপাহার

2
দ্বিতীয় ভাগের জন্য তারিখ পার্ট হিসাবে আমি একটি ত্রুটি বার্তা পাই ( The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.)। মনে হচ্ছে MINUTE হ'ল ক্ষুদ্রতম ডেট পার্ট যা আপনি এই পদ্ধতির সাথে ব্যবহার করতে পারেন।
jeroenh

1
@ জিরোহেন, আপনি সঠিক বলেছেন আমি সে সম্পর্কে কথা বলার জন্য একটি বিভাগ যুক্ত করেছি। tldr: পরিবর্তনের 0জন্য '2000'(উদ্ধৃতি গুরুত্বপূর্ণ!) এবং চেষ্টা SECONDআবার।
মাইকেল - ক্লে শিরকি কোথায়

17

টি-এসকিউএল এ আপনি করতে পারেন:

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date], DATEPART(hh, [Date])

অথবা

মিনিট ব্যবহার দ্বারা DATEPART(mi, [Date])

অথবা

10 মিনিটের মধ্যে ব্যবহার করুন DATEPART(mi, [Date]) / 10(যেমন টিমোথির প্রস্তাবিত)


1
গ্রুপ দ্বারা [তারিখ], তারিখ (এইচ, [তারিখ]) একটি জগাখিচুড়ি, না?
CND

1
@nCdy ঠিকঠাক হওয়া উচিত, অন্যথায় আপনি একটি ত্রুটি পেয়েছেন "... বাছাই তালিকায় অবৈধ কারণ এটি কোনও সামগ্রিক ফাংশন বা গ্রুপের গ্রুপের মধ্যে নেই"
tzup

1
আপনি কীভাবে পুরো তারিখ এবং একই সময়ে কয়েক ঘন্টা দ্বারা গ্রুপ করবেন? আমি কেবল মিন ডেট ব্যবহার করছি using

আপনি যদি সর্বনিম্ন (তারিখ) ব্যবহার করেন তবে অবশ্যই আপনি গ্রুপ দ্বারা তারিখটি বের করতে পারেন।
tzup

3
10 দ্বারা বিভক্ত মিনিটগুলি 10 মিনিটের ব্যবধানে গ্রুপিং তৈরি করবে, যা আমার প্রয়োজন। মডুলো 10 কোনও অর্থ দেয় না।
Tar থেকে

12

10 মিনিটের ব্যবধানের জন্য, আপনি চাইবেন

GROUP BY (DATEPART(MINUTE, [Date]) / 10)

Tzup এবং পিটার 888 দ্বারা ইতিমধ্যে উল্লিখিত ছিল ... ঠিক এক ঘন্টা ব্যবধান করতে

GROUP BY DATEPART(HOUR, [Date])

2
তবে এখানে আমি ২০১১ সালের মিনিটের সাথে ১৯৮০ সালের মিনিটগুলি গ্রুপ করছি: এসআই এটির যত্ন নেওয়া দরকার।
শে

% সঠিক গণিত হবে? এটি 10 ​​টি গ্রুপ তৈরি করবে না। উদাহরণস্বরূপ: 1% 10 = 9 2% 10 = 8 এটি এমনকি সঠিক কালানুক্রমিক গ্রুপিংও হবে না। আমি মনে করি কেবল একটি সাধারণ বিভাজন সঠিক হবে। যদি না%% বর্গের মধ্যে অবশিষ্ট ভাগ না হয় isn't
স্টিভেন

12
10 দ্বারা বিভক্ত মিনিটগুলি 10 মিনিটের ব্যবধানে গ্রুপিং তৈরি করবে, যা আমার প্রয়োজন। মডুলো 10 কোনও অর্থ দেয় না।
Tar থেকে

তার সাথে একমত গ্রুপিংয়ের অর্থ হয় না।
মাইকমুরকো

7

কিছু হতে হবে

select timeslot, count(*)  
from 
    (
    select datepart('hh', date) timeslot
    FROM [FRIIB].[dbo].[ArchiveAnalog]  
    ) 
group by timeslot

(সিনট্যাক্স সম্পর্কে 100% নিশ্চিত নয় - আমি আরও বেশি ওরাকল ধরণের লোক)

ওরাকলে:

SELECT timeslot, COUNT(*) 
FROM
(  
    SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot 
    FROM
    (
        SELECT l_time FROM mytab  
    )  
) GROUP BY timeslot 

6

লেখকটির মূল উত্তরটি বেশ ভাল কাজ করেছে। এই ধারণাটি প্রসারিত করার জন্য, আপনি এর মতো কিছু করতে পারেন

group by datediff(minute, 0, [Date])/10

যা আপনাকে দীর্ঘ সময়ের পরে 60০ মিনিটের মধ্যে দলবদ্ধ করতে দেয়, 720 বলুন, যা অর্ধেক দিন ইত্যাদি etc.


1
উপরের মাইএসকিউএল কোয়েরিটি কী হবে?
বিরানচি

4

মাইএসকিউএল এর জন্য:

GROUP BY
DATE(`your_date_field`),
HOUR(`your_date_field`),
FLOOR( MINUTE(`your_date_field`) / 10);

1

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

CREATE FUNCTION [dbo].[fn_MinuteIntervals]
    (
      @startDate SMALLDATETIME ,
      @endDate SMALLDATETIME ,
      @interval INT = 1
    )
RETURNS @returnDates TABLE
    (
      [date] SMALLDATETIME PRIMARY KEY NOT NULL
    )
AS
    BEGIN
        DECLARE @counter SMALLDATETIME
        SET @counter = @startDate
        WHILE @counter <= @endDate
            BEGIN
                INSERT INTO @returnDates VALUES ( @counter )
                SET @counter = DATEADD(n, @interval, @counter)
            END
        RETURN
    END

1
declare @interval tinyint
set @interval = 30
select dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0), sum(Value_Transaction)
from Transactions
group by dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0)

8
স্ট্যাকওভারফ্লোতে স্বাগতম। আপনাকে নিজের উত্তরটি পুরোপুরি ব্যাখ্যা করতে হবে এবং এটি ইতিমধ্যে সাইটে থাকা অন্য 10 টি উত্তরগুলিতে কী যুক্ত করে।
সাইমন.এসএ

0

এসকিউএল সার্ভার ২০১২-এর জন্য, যদিও আমি বিশ্বাস করি এটি এসকিউএল সার্ভার ২০০৮ আরআর-তে কাজ করবে তবে আমি সময়টি মিলিসেকেন্ডে কাটানোর জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করি:

DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time)

এটি এর দ্বারা কাজ করে:

  • একটি নির্দিষ্ট পয়েন্ট এবং লক্ষ্য সময়ের মধ্যে মিলিসেকেন্ডের সংখ্যা পাওয়া:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • Mill মিলিসেকেন্ডগুলিকে সময় বিভাজনে ভাগ করার অবশিষ্ট অংশ গ্রহণ করা:
    @rms = @ms % @msPerSlice
  • স্লাইস সময় পেতে লক্ষ্য সময়ের সাথে সেই অবশিষ্টের ofণাত্মক যোগ করা:
    DATEADD(MILLISECOND, -@rms, time)

দুর্ভাগ্যক্রমে, মাইক্রোসেকেন্ড এবং ছোট ইউনিটগুলির সাথে এটি ওভারফ্লোগুলি যেমন রয়েছে তেমনি বৃহত্তর, সূক্ষ্ম ডেটা সেটগুলিতে কম সুবিধাজনক নির্দিষ্ট পয়েন্ট ব্যবহার করা দরকার।

আমি এইটিকে কঠোরভাবে বেঞ্চমার্ক করি নাই এবং আমি বড় ডেটাতেও আছি না, সুতরাং আপনার মাইলেজটি ভিন্ন হতে পারে, তবে আমাদের সরঞ্জাম এবং ডেটা সেটগুলিতে চেষ্টা করা অন্যান্য পদ্ধতির তুলনায় পারফরম্যান্স লক্ষণীয়ভাবে খারাপ ছিল না এবং নির্বিচারে কাটানোর জন্য বিকাশকারী সুবিধায় অর্থ প্রদান এটি সার্থক করে তোলে makes আমাদের জন্য.


0
select from_unixtime( 600 * ( unix_timestamp( [Date] ) % 600 ) ) AS RecT, avg(Value)
from [FRIIB].[dbo].[ArchiveAnalog]
group by RecT
order by RecT;

আপনি গ্রুপ করতে চান যে সেকেন্ডের সংখ্যা দ্বারা দুটি 600 প্রতিস্থাপন করুন।

আপনার যদি প্রায়শই এটির প্রয়োজন হয় এবং টেবিলটি পরিবর্তন না হয়, যেমন আর্কাইভ নামটি সূচিত করে, সম্ভবত টেবিলে ইউনিক্সটাইম হিসাবে তারিখটি (এবং সময়) রূপান্তর করা এবং সংরক্ষণ করা কিছুটা দ্রুত হতে পারে।


0

আমি জানি আমি এটির সাথে শোতে দেরি করেছি, তবে আমি এটি ব্যবহার করেছি - বেশ সহজ পদ্ধতির। এটি আপনাকে কোনও বৃত্তাকার সমস্যা ছাড়াই 60 মিনিটের টুকরোগুলি পেতে দেয়।

Select 
   CONCAT( 
            Format(endtime,'yyyy-MM-dd_HH:'),  
            LEFT(Format(endtime,'mm'),1),
            '0' 
          ) as [Time-Slice]

0
select dateadd(minute, datediff(minute, 0, Date), 0),
       sum(SnapShotValue)
FROM [FRIIB].[dbo].[ArchiveAnalog]
group by dateadd(minute, datediff(minute, 0, Date), 0)

1
আপনি যখন কোনও প্রশ্নের উত্তর দেন দয়া করে কিছু ব্যাখ্যা সরবরাহ করুন।
শিজ্জেন 83
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.