কীভাবে আমি এসকিউএল সার্ভারে একটি ডেটটাইম ছাঁটাই করতে পারি?


280

এসকিউএল সার্ভার ২০০৮-তে ডেটটাইম মান (কয়েক মিনিট এবং সেকেন্ড সরিয়ে ফেলতে) কেটে দেওয়ার সর্বোত্তম উপায় কী?

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

declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)

-----------------------
2009-05-28 00:00:00.000

উত্তর:


494

এটি বেশ কয়েক বছর পরেও প্রায়শই অতিরিক্ত ভোট সংগ্রহ করা অবিরত করে চলেছে এবং তাই এসকিএল সার্ভারের আধুনিক সংস্করণগুলির জন্য আমার এটি আপডেট করা দরকার। এসকিএল সার্ভার ২০০৮ এবং তার পরে, এটি সহজ:

cast(getDate() As Date)

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

তবে এটি সম্পাদন করার অন্যান্য উপায়ও রয়েছে। এখানে সর্বাধিক সাধারণ।

সঠিক উপায় (SQL সার্ভার ২০০৮ সাল থেকে নতুন):

cast(getdate() As Date)

সঠিক উপায় (পুরানো):

dateadd(dd, datediff(dd,0, getDate()), 0)

এটি এখন বয়স্ক, তবে এটি এখনও জানার মতো কারণ এটি মাসের প্রথম মুহুর্ত, মিনিট, ঘন্টা বা বছরের মতো অন্যান্য সময় পয়েন্টগুলির জন্যও সহজেই খাপ খাইয়ে নিতে পারে।

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

দ্রুত উপায়:

cast(floor(cast(getdate() as float)) as datetime)

এটি কাজ করে কারণ ডেটটাইম কলামগুলি 8-বাইট বাইনারি মান হিসাবে সঞ্চয় করা হয়। ভগ্নাংশটি সরিয়ে ফেলতে তাদের ভাসিয়ে দিন, মেঝে সরানোর জন্য মেঝে করুন এবং মানগুলির সময় অংশ চলে যাবে যখন আপনি সেগুলি ডেটটাইমে ফিরিয়ে দিন। কোনও জটিল যুক্তি ছাড়াই এটি কিছুটা স্থানান্তরিত এবং এটি খুব দ্রুত।

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

ভুল পথ:

cast(convert(char(11), getdate(), 113) as datetime)

একটি ভুল স্ট্রিংতে রূপান্তরিত করে, স্ট্রিং কেটে ফেলে এবং ডেটটাইমে ফিরে রূপান্তর করে কাজ করে। এটি ভুল , দুটি কারণে: 1) এটি সমস্ত লোকেল ধরে কাজ করতে পারে না এবং 2) এটি করার সবচেয়ে ধীরতম উপায় সম্পর্কে ... এবং কেবল সামান্য নয়; এটি অন্য বিকল্পগুলির চেয়ে দু'গুণ বেশি মাত্রার ক্রমের মতো।


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

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

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

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


6
আমি সবেমাত্র চালিয়েছি এমন একটি মাপদণ্ড অনুসারে ২০০৮ সালের জন্য "দ্রুতগতি" এখনও দ্রুততম পথ
স্যাম সাফ্রন

3
অবগতির জন্য: stackoverflow.com/q/1177449/27535 এবং stackoverflow.com/q/133081/27535 dateadd / datediff "জয় ..."। একক ভেরিয়েবলের জন্য, যিনি অবশ্যই যত্নবান এবং একজন আশা করেন যে আপনি গণিত কলামগুলি করেছেন বা এরকম মিলিয়ন মিলিয়ন সারি :-)
জিবিএন

9
এই "সঠিক" উপায়টি দুর্ঘটনাক্রমে কেবল কার্যকর হয়। এটি যেভাবে লেখা হয়েছে তা হ'ল ডেটএডএডের বাক্য গঠন (অন্তর, তারিখ, বর্ধন) ছিল, তবে তা নয়। এটি (অন্তর, বৃদ্ধি, তারিখ)। আমি মাসের প্রথম তারিখে একটি তারিখ ছাঁটাই করার চেষ্টা করার সময় আমি এতে হোঁচট খেয়েছি: নির্বাচন করুন তারিখ (এম, 0, ডেটেডিএফ (এম, 0, গেট আপডেট ())) কাজ করে না, তবে নির্বাচনের তারিখ (এম, ডিএটিডিএফ) (এম, 0, GETDATE ()), 0) করে। কমপক্ষে, এটি আমি ২০০৮-এ দেখি 2
কেলি ক্লাইন

1
@ কেলি ২০০৮-এ, কেন শুধু নয় cast(getdate() as date)?
জোয়েল কোহর্ন

2
তারা সকলেই ডেটটাইম কলামে কাজ করে। getdate()আপনার কাছে যা যা ডেটটাইম উত্স হতে পারে তার জন্য এখানে একটি স্থিতি রয়েছে।
জোয়েল কোহর্ন 14

44

শুধুমাত্র এসকিউএল সার্ভারের জন্য 2008

CAST(@SomeDateTime AS Date) 

তারপরে আপনি চাইলে এটি ডেটটাইমে ফেরত দিন

CAST(CAST(@SomeDateTime AS Date) As datetime)

ভালো কথা: আমি এখনও ২০০৫ এ আছি এবং ২০০৮ এর জন্য সম্ভবত এটিই সম্ভবত নতুন "সঠিক" উপায় এবং এমনকি "দ্রুত" পথের পারফরম্যান্সের সাথে মেলে।
জোয়েল কোহর্ন

1
এই নতুন পদ্ধতির পারফরম্যান্স "দ্রুত" রাস্তার চেয়েও দ্রুত।
এরিক

21

কেবলমাত্র আরও সম্পূর্ণ উত্তরের জন্য, এখানে তারিখের অংশগুলিকে নিচে GETDATE()কাটা এবং কয়েক মিনিট অন্তর্ভুক্ত করার জন্য একটি কার্যকরী উপায় রয়েছে (কাটানোর তারিখের সাথে প্রতিস্থাপন )।

এটি গ্রহণযোগ্য উত্তরের চেয়ে আলাদা যে আপনি কেবল dd(দিন) নয়, তারিখের যে কোনও অংশ ( এখানে দেখুন ) ব্যবহার করতে পারবেন :

dateadd(minute, datediff(minute, 0, GETDATE()), 0)

নোট করুন যে উপরের মত প্রকাশে, এটি 0একটি বছরের শুরুতে (1900-01-01) একটি স্থির তারিখ। আপনার যদি ছোট অংশগুলিতে, যেমন সেকেন্ড বা মিলিসেকেন্ডে ছাঁটাই করতে হয়, আপনার একটি ধ্রুবক তারিখ গ্রহণ করা উচিত যা একটি অতিরিক্ত প্রবাহ এড়াতে কাটার তারিখের কাছাকাছি।


1
এটি মারাত্মকভাবে সহায়ক ছিল। আমি পুরো দিনের চেয়ে কম জায়গায় তারিখ-সময়কে কাটানোর উপায়টির দিকে চেয়েছিলাম।
মাইকেল - ক্লে শিরকি

1
@ মিশেল, প্রতিক্রিয়াটির জন্য আপনাকে ধন্যবাদ জানার জন্য এটি আপনাকে সাহায্য করেছে!
Lucero

1
+1 এর আরও বেশি পরিমাণে উচিৎ হওয়া উচিত, এটি দুর্দান্ত উত্তর যা নির্বাচিত উত্তরে প্রসারিত হয়।
jtate

1
ঠিক তাই ইন্টারনেট জানে, আপনাকে পুরো ডেট পার্ট পিরিয়ডের মধ্যে সীমাবদ্ধ রাখতে হবে না। পূর্ণসংখ্যা বিভাগটি ব্যবহার করে 15 মিনিটের ব্যবধানের জন্য এখানে একটি উদাহরণ দেওয়া হয়েছে:dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
মাইকেল - ক্লে শিরকি কোথায়

7

ওয়েবে যখন স্নিপেটটি আমি পেয়েছিলাম তখন তা ছিল:

 dateadd(dd,0, datediff(dd,0, YOURDATE))
 e.g.
 dateadd(dd,0, datediff(dd,0, getDate()))

আমি 2005 এ আছি, কিন্তু আমি ভেবেছিলাম 2008 এর জন্য কিছু নতুন ফাংশন আছে ??
কেএম

2
ঝরঝরে! আমি ডেট পার্টগুলি ভাগ করে নেওয়ার জন্য স্ট্রিং হ্যান্ডলিং ব্যবহার করে এগুলিকে একসাথে রেখে দিতে চাইতাম। প্রাসঙ্গিক নাও হতে পারে তবে এসকিউএল ২০০৮-তে সময় উপাদান ছাড়াই খাঁটি তারিখের কেবল ডেটা টাইপ রয়েছে।
ফ্রান্স 21

1
এবং নোট করুন যে আপনার তারিখ সংযোজন অপারেশনগুলি মিশ্রিত হয়েছে, এটি DateAdd(dd, DateDiff(...), 0)। আপনি যত্নবান না হলে এটি আপনাকে কামড়াতে পারে।
এরিক

1

এসকিউএল 2005-এ আপনার ট্রাঙ্ক_ডেট ফাংশনটি এভাবে লেখা যেতে পারে।

(1)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
    CAST(FLOOR( CAST( @date AS FLOAT ) )AS DATETIME)
END

প্রথম পদ্ধতিটি অনেক বেশি ক্লিনার। এটি চূড়ান্ত CAST () সহ কেবলমাত্র 3 টি পদ্ধতি কল ব্যবহার করে এবং কোনও স্ট্রিং কনকেন্টেশন দেয় না, যা একটি স্বয়ংক্রিয় প্লাস। তদুপরি, এখানে বিশাল ধরণের কাস্ট নেই ts আপনি যদি কল্পনা করতে পারেন যে তারিখ / সময় স্ট্যাম্পগুলি প্রতিনিধিত্ব করা যায়, তবে তারিখ থেকে সংখ্যায় এবং তারিখগুলিতে ফিরে রূপান্তর করা মোটামুটি সহজ প্রক্রিয়া।

(2)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
      SELECT CONVERT(varchar, @date,112)
END

আপনি যদি মাইক্রোসফ্টের ডেটটাইম (2) বা (3) প্রয়োগের বিষয়ে উদ্বিগ্ন হন তবে ঠিক আছে।

(3)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
SELECT CAST((STR( YEAR( @date ) ) + '/' +STR( MONTH( @date ) ) + '/' +STR( DAY(@date ) )
) AS DATETIME
END

তৃতীয়ত, আরও ভার্বোজ পদ্ধতি। এর জন্য তারিখটি তার বছরের, মাস এবং দিনের অংশগুলিতে বিভক্ত করা উচিত, তাদেরকে "yyyy / মিমি / ডিডি" ফর্ম্যাটে একসাথে রেখে তারপরে তারিখের পিছনে ফেলে দেওয়া দরকার। এই পদ্ধতিতে চূড়ান্ত CAST () সহ 7 টি পদ্ধতি কল অন্তর্ভুক্ত থাকে, স্ট্রিং কনকেন্টেশন উল্লেখ না করা।



0

(DATETIME যেমন float হিসাবে মেঝে (ঢালাই (getdate ()))) এতে কাস্ট নির্বাচন এই রেফারেন্স: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html


ফ্লোতে কাস্ট করা এবং ডেটটাইমে ফিরে আসা সঠিকভাবে কাজ করে না
এরিক

0

আপনারা যারা এখানে এসেছেন তারা একটি ডেটাটাইম ফিল্ডকে পুরো দিনের চেয়ে কম কিছুতে কাটানোর উপায় খুঁজছেন, উদাহরণস্বরূপ প্রতি মিনিটে, আপনি এটি ব্যবহার করতে পারেন:

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) + (FLOOR((CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT))) * 1440.0) + (3.0/86400000.0)) / 1440.0 AS DATETIME)

সুতরাং আজ যদি 2010-11-26 14:54:43.123এই হয় ফিরে আসবে 2010-11-26 14:54:00.000

ব্যবধানটি পরিবর্তিত করতে এটি একদিনের ব্যবধানের সাথে 1440.0 প্রতিস্থাপন করে, উদাহরণস্বরূপ:

24hrs          =   24.0  (for every hour)
24hrs / 0.5hrs =   48.0  (for every half hour)
24hrs / (1/60) = 1440.0  (for every minute)

(সর্বদা .0স্পষ্টভাবে একটি ফ্লোটে কাস্ট করতে শেষ করুন put )


আপনাদের মধ্যে যারা হতাশ কি জন্য (3.0/86400000)আমার হিসাব জন্য, SQL সার্ভার 2005 থেকে কাস্ট করার বলে মনে হচ্ছে না FLOATকরার DATETIMEসঠিকভাবে, তাই এই এটি মেঝে সামনে 3 মিলিসেকেন্ড যোগ করা হয়েছে।


1
ভাসমান পয়েন্ট যথার্থ সীমাবদ্ধতার কারণে রাউন্ডিং ত্রুটিগুলি সম্পর্কে সতর্ক থাকুন ... এছাড়াও, এটি datetime2ডেটা টাইপের সাথে কাজ করে না work
Lucero

আওয়ারের জন্য, DATEADDD (ঘন্টা, DATEDIFF (ঘন্টা, 0, GETDATE ()), 0) এছাড়াও কাজ করুন নির্বাচন করুন। মিনিটটিও খুব বেশি, তবে দ্বিতীয়টি একটি ওভারফ্লোতে পরিণত হবে।
কেলি ক্লাইন

ফ্লোতে কাস্ট করা এবং ডেটটাইমে ফিরে আসা সঠিকভাবে কাজ করে না
এরিক

0

এই কোয়েরিতে আপনাকে trunc(sysdate)ওরাকলে সমতুল্য ফলাফল দেওয়া উচিত ।

SELECT  * 
FROM    your_table
WHERE   CONVERT(varchar(12), your_column_name, 101)
      = CONVERT(varchar(12), GETDATE(), 101)

আশাকরি এটা সাহায্য করবে!


0

আপনি using Substringডেটটাইম ভেরিয়েবল থেকে তারিখও বের করতে পারেন এবং ডেটটাইমে ফিরে কাস্ট করা সময় অংশটিকে উপেক্ষা করবে।

declare @SomeDate datetime = '2009-05-28 16:30:22'
SELECT cast(substring(convert(varchar(12),@SomeDate,111),0,12) as Datetime) 

এছাড়াও, আপনি ডেটটাইম ভেরিয়েবলের অংশগুলি অ্যাক্সেস করতে পারেন এবং এগুলি একটি কাঠের কাটা কাটা তারিখে মার্জ করতে পারেন, এরকম কিছু:

SELECT cast(DATENAME(year, @Somedate) + '-' + 
       Convert(varchar(2),DATEPART(month, @Somedate)) + '-' +
       DATENAME(day, @Somedate) 
       as datetime)

0

ওরাকল:

TRUNC(SYSDATE, 'MONTH')

SQL সার্ভার:

DATEADD(DAY, - DATEPART(DAY, DateField) + 1, DateField)

একইভাবে কোনও তারিখ থেকে কয়েক মিনিট বা ঘন্টা ছাঁটাই করার জন্য ব্যবহার করা যেতে পারে।



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