এসকিউএল সার্ভারে তারিখের সময় অংশটি সরিয়ে দেওয়ার জন্য সেরা পদ্ধতির


514

এসকিউএল সার্ভারে একটি ডেটটাইম ক্ষেত্র থেকে সময় অংশটি সরিয়ে দেওয়ার সময় কোন পদ্ধতিটি সেরা পারফরম্যান্স সরবরাহ করে?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

অথবা

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

দ্বিতীয় পদ্ধতিটি যে কোনও উপায়ে আরও কয়েকটি বাইট প্রেরণ করে তবে তা রূপান্তরটির গতির মতো গুরুত্বপূর্ণ হতে পারে না।

উভয়ই খুব দ্রুত বলে মনে হয়, কিন্তু কয়েক হাজার-কয়েক হাজার বা তারও বেশি সারিগুলি ব্যবহার করার সময় গতির মধ্যে পার্থক্য থাকতে পারে?

এছাড়াও, এসকিউএল-তে একটি ডেটটাইমের সময় অংশ থেকে মুক্তি পাওয়ার জন্য আরও ভাল পদ্ধতি আছে কি এটি সম্ভব?


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

9
18,000,000 সারিগুলিতে এটি আমি খুঁজে পেয়েছি (এসকিউএল সার্ভার ২০০৮): পদ্ধতি বি এর চেয়ে প্রায় 24% ধীরে ধীরে ধীর। ক্যাসেট (ফ্লোর (ক্যাসেট (যেমন ফ্লাট)) হিসাবে তারিখ হিসাবে) পদ্ধতি ক এর চেয়ে 3.5% ধীর। পদ্ধতিটি মনে হয় পারফরম্যান্সের সাথে একটি বিজয়ী। দুর্দান্ত উত্তরের জন্য সবাইকে ধন্যবাদ।
স্টিফেন পেরেলসন 13

46
কেন হেক এসকিউএল এর কোনও বিল্ট-ইন ফাংশন নেই তা যাইহোক? !!
গ্যারি ম্যাকগিল 14

10
এসকিউএল ২০০৮ এর নতুন তারিখের ডেটাটাইপ এটি পরিচালনা করবে।
ফিলিপ কেলি 14

উত্তর:


557

কঠোরভাবে, পদ্ধতিটি aসর্বনিম্ন সংস্থান নিবিড়:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

হাতে মোটামুটিভাবে খুব বেশি সময় নিয়ে কারও কারও দ্বারা মিলিয়ন সারিতে একই মোট সময়ের জন্য কম সিপিইউ নিবিড় প্রমাণিত: এসকিউএল সার্ভারের সবচেয়ে কার্যকরী উপায় তারিখ + সময় থেকে তারিখ পেতে?

আমি একই জায়গায় একই ফলাফল দেখতে অন্য কোথাও দেখতে পেলাম।

আমি তারিখ / তারিখটি পছন্দ করি কারণ:

  • বর্ণচর ভাষা / তারিখের বিষয়গুলির সাথে সম্পর্কিত
    উদাহরণ: আমার CASE এক্সপ্রেশনটি কেন অ- বিড়ম্বনীয় ?
  • ভাসা অভ্যন্তরীণ স্টোরেজ উপর নির্ভর করে
  • এটি "0" বেস পরিবর্তন করে মাসের প্রথম দিন, আগামীকাল ইত্যাদির কাজ করে

সম্পাদনা করুন, অক্টোবর 2011

SQL সার্ভার 2008+ জন্য, আপনি কাস্ট করতে পারবেন dateঅর্থাত CAST(getdate() AS date)। বা কেবল dateডেটাটাইপ ব্যবহার করুন যাতে অপসারণের সময় নেই।

সম্পাদনা করুন, জানুয়ারী ২০১২

এটি কতটা নমনীয় তার একটি কার্যকরী উদাহরণ: স্কেল সার্ভারে বৃত্তাকার সময় বা তারিখের চিত্র দ্বারা গণনা করা দরকার

সম্পাদনা করুন, মে 2012

এটিকে WHERE ধারাগুলিতে এবং এই জাতীয় চিন্তাভাবনা না করে ব্যবহার করবেন না: একটি কলামে একটি ফাংশন বা CAST যুক্ত করা সূচক ব্যবহারকে অকার্যকর করে দেয়। 2 নম্বর এখানে দেখুন: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistkes/

এখন, এটির পরে এসকিউএল সার্ভার অপটিমাইজার সংস্করণগুলির CAST তারিখটি সঠিকভাবে পরিচালনার উদাহরণ রয়েছে, তবে সাধারণত এটি খারাপ ধারণা হবে ...

তারিখ 2 এর জন্য সেপ্টেম্বর 2018 সম্পাদনা করুন

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)

3
@ ডেভিড সোপকো অক্টোবর ২০১১ সম্পাদনার জন্য কোডটি হবে: তখন castালাই নির্বাচন করুন (GETDATE () তারিখ হিসাবে)
স্মিথ

1
এসকিউএল এর আরও সাম্প্রতিক সংস্করণের জন্য, ডেটটাইমের পরিবর্তে তারিখ ব্যবহার করা কয়েক ঘন্টা মোকাবেলা করার প্রয়োজনীয়তা এড়িয়ে চলে। নিম্নলিখিত নমুনাটি ব্যবহার করুন: টাইম ডেটটাইম = গেটেটের সাথে নোটাইম ডেট = গেটডেট () ঘোষণা করুন) @ নোটটাইম, @ উইথটাইম নির্বাচন করুন
ওজকারি

1
আপনার কেবল তারিখের প্রয়োজন হলে তারিখ হিসাবে theালাই দুর্দান্ত। তবে প্রায়শই আপনাকে মধ্যরাতে বর্তমান তারিখের প্রয়োজন হয় যাতে আপনি আরও কিছু তারিখের কারসাজি করতে পারেন। DATEতথ্য সময় আপনার dateadd, datediff ভালো জিনিস সম্পর্কে এবং অন্যান্য তারিখ / সময় ধরনের তথ্য সাথে আলাপচারিতার না দেওয়া হবে কি এ জঘন্যভাবে নিয়ন্ত্রণমূলক হয়। এই ক্ষেত্রে, DATEADD()পদ্ধতির রাজা রাজা।
Xedni

এটি প্রতিটি তারিখের জন্য কাজ করে না। আমি ভুল হিসাবে বছরের 0218পরিবর্তে প্রবেশ করেছি 2018এবং DATEDIFFআপনার বক্তব্যের অংশটি একটি ব্যতিক্রম ছুঁড়েছে The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range datetime valueচেষ্টা করুন:select DATEDIFF(dd, 0, convert(datetime2(0), '0218-09-12', 120))
বার্নহার্ড ডাবলার

1
জুলাই ২০০৯ এ @ বার্নহার্ডড্যাবলার যখন আমি উত্তর দিয়েছিলাম, "0218" একটি বৈধ তারিখ হত তবে আপনি এত দিন পেতেন না। এছাড়াও "0" ডেটটাইম 2 এর জন্য 19000101 তে রূপান্তর করে না। এই নির্বাচনটি ব্যবহার করে দেখুনSELECT DATEDIFF(dd, '19000101', convert(datetime2(0), '0218-09-12', 120))
জিবিএন

69

এসকিউএল সার্ভার ২০০৮ এ আপনি ব্যবহার করতে পারেন:

CONVERT(DATE, getdate(), 101)

13
তৃতীয় যুক্তির ফলাফলটি একেবারে কোনও থেকে রূপান্তরিত datetimeকরার সময় কোনও ফল নেই date, এবং সুতরাং আপনার সমাধান কার্যকরভাবে ন্যায়বিচারে সিদ্ধ হয় CONVERT(DATE,getdate())যা ইতিমধ্যে একাধিকবার পরামর্শ দেওয়া হয়েছে।
অ্যান্ড্রি এম

কেবল CAST(GETDATE() AS DATE)এএসএসআই ব্যবহার করুন বা কঠোরভাবে CAST(CURRENT_TIMESTAMP AS DATE)যা আমি মনে করি নিরর্থক। প্রথমটির সাথে থাকুন।
ইভানজিনহো

52

অবশ্যই এটি একটি পুরানো থ্রেড তবে এটি সম্পূর্ণ করার জন্য।

এসকিউএল ২০০৮ থেকে আপনি তারিখের ডেটাটাইপ ব্যবহার করতে পারেন যাতে আপনি সহজভাবে এটি করতে পারেন:

SELECT CONVERT(DATE,GETDATE())

21
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

... নীচে মন্তব্য অনুযায়ী, একটি ভাল সমাধান নয়

আমি এই উত্তরটি মুছে ফেলব, তবে আমি এটি এখানে একটি পাল্টা উদাহরণ হিসাবে ছেড়ে দেব কারণ আমি মনে করি এটি কম ধারণাকারীদের কেন ভাল ধারণা নয় তা সম্পর্কে ব্যাখ্যা এখনও কার্যকর।


জিবিএন এর উত্তর দেখুন, অনেকে এটি তদন্ত করেছেন। DATETIMEs ভাসমান হিসাবে সংরক্ষণ করা হয় না এবং তাই DATEADD / DATEDIFF ব্যবহার করে গাণিতিক ম্যানিপুলেশনকে টাইপগুলির মধ্যে CAST করা দরকার।
ম্যাটবাইলি

আমি স্বীকার করতে পারি যে আপনি যে কারণে বর্ণনা করেছেন তার জন্য আপনি DATETIME থেকে ফ্লাট পর্যন্ত একটি কাস্ট এড়াতে চাইতে পারেন, তবে সেই ক্ষেত্রে ওপিএস বিকল্পে (ক) শূন্য থেকে অন্তর্ভুক্ত রূপান্তরটিও কোনও সমস্যা নয়? হুমম ... আমি মনে করি সেক্ষেত্রে এটি কোনও ফ্ল্যাট নয় এবং সার্ভারটি সম্ভবত সময়ের তথ্য ত্যাগ করতে যথেষ্ট স্মার্ট। ঠিক আছে, আমি স্বীকার করি :-)
গ্যারি ম্যাকগিল

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

ভাসতে কাস্ট করা ভয়াবহভাবে নজিরবিহীন। এই উত্তরটি মুছে ফেলা উচিত। কারও এই কোড ব্যবহার করা উচিত নয়।
usr

3
এটি ভাসতে এবং ডেটটাইমে ফিরে castালাই নিরাপদ নয় - ভাসমানের পর্যাপ্ত নির্ভুলতা নেই। সুতরাং আমি মনে করি এটি মোটেও সুপারিশ করা যায় না। আরও বিস্তারিত জানার জন্য এই পোস্টটি দেখুন
এরিক

17

এসকিউএল সার্ভার ২০০৮-এ একটি তারিখের তারিখ টাইপ (একটি টাইম ডেটাটাইপ) রয়েছে।

CAST(GetDate() as DATE)

অথবা

declare @Dt as DATE = GetDate()

এটিই আমি ব্যবহার করেছি এবং এটি ভালভাবে কাজ করেছে। সহজ উত্তর মত মনে হচ্ছে। ডাব্লু / কনভার্টের সাথে একত্রে ব্যবহারের কোনও ডাউনসাইড?
joelmdev

1
CAST এবং CONVERT ফাংশনে সমান। পার্থক্যটি হ'ল CAST এএনএসআই স্ট্যান্ডার্ডের একটি অংশ, যখন কনভার্ট টি-এসকিউএল-এর সাথে নির্দিষ্ট। সুতরাং, যেখানে সম্ভব CAST ব্যবহার করুন।
ট্রয়

@ ট্রয় আমি CAST ব্যবহার করি কারণ আমি 3 টি টাইপিং অক্ষর সংরক্ষণ করতে পারি এবং সিনট্যাক্স
কনভার্টের

8

অন্য সদৃশ প্রশ্ন থেকে এখানে আরও একটি উত্তর এখানে রয়েছে :

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

এই যাদু নম্বর পদ্ধতিটি DATEADD পদ্ধতির চেয়ে কিছুটা দ্রুত সম্পাদন করে। (এটি 10% ডলার মত দেখাচ্ছে)

এক মিলিয়ন রেকর্ডের বিভিন্ন রাউন্ডে সিপিইউ সময়:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

তবে মনে রাখবেন যে এই সংখ্যাগুলি সম্ভবত অপ্রাসঙ্গিক কারণ তারা ইতিমধ্যে খুব দ্রুত are আমার 100,000 বা তার বেশি রেকর্ড সেট না থাকলে আমি সিপিইউ টাইমও শূন্যের উপরে পড়তে পারি না।

ডেটএডএড এই উদ্দেশ্যে ব্যবহার করা হয়েছে এবং আরও দৃ rob়, এই বিষয়টি বিবেচনা করে আমি বলতে চাই যে ডেটএড ব্যবহার করুন।


1
এটা ভয়াবহ। আমি কখনই আমার ডেটা ঝুঁকিতে ফেলতাম না। আপনি যা পরীক্ষা করেছেন কেবল তা নয়, সমস্ত তারিখের জন্য এটি সঠিক কিনা কে জানে ।
usr

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

@ এরিক ভালো পয়েন্ট আপনার উত্তরটি ব্যবহারের সম্ভাবনা সরবরাহ করে '12:00:00.003'যা আমি মনে করি যা আরও ভাল।
usr ডিরেক্টরির

6
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

4
একটি বৈধ বিকল্প, হ্যাঁ। যদিও এই থ্রেডে একাধিকবার প্রস্তাব দেওয়া হয়েছে।
অ্যান্ড্রি এম

সত্যিই, এই সমাধানটি পড়া সবচেয়ে সহজ। আমার
গোটো

5

আমি আসলেই পচ্ছ্ন্দ করি:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)

120বিন্যাস কোড আইএসও 8601 মান মধ্যে তারিখ নিগৃহীত হবে:

'YYYY-MM-DD' or '2017-01-09'

ডিপিপ্লায়ার ( R) এবং পান্ডাস ( ) এ ব্যবহার করা খুব সহজ Python!


3

হুঁশিয়ার!

পদ্ধতি ক) এবং খ) সর্বদা একই আউটপুট থাকে না!

select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)

আউটপুট: 2014-01-01 00:00:00.000

select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)

আউটপুট: 2013-12-31 00:00:00.000

(এমএস এসকিউএল সার্ভার ২০০ 2005 এবং ২০০৮ আর 2 এ পরীক্ষিত)

সম্পাদনা: অ্যাডামের মন্তব্য অনুসারে, আপনি টেবিল থেকে তারিখের মানটি পড়লে এটি ঘটতে পারে না, তবে আপনি যদি আপনার তারিখের মানকে আক্ষরিক হিসাবে সরবরাহ করেন তবে এটি ঘটতে পারে (উদাহরণস্বরূপ: ADO.NET এর মাধ্যমে ডাকা একটি সঞ্চিত পদ্ধতির প্যারামিটার হিসাবে)।


1
.999 কোনও DATETIMEকলামে এসকিউএল সার্ভারে সংরক্ষণ করা যাবে না । সর্বোচ্চ প্রাপ্তিসাধ্য .997 থেকে হল: msdn.microsoft.com/en-us/library/ms187819.aspx আপনি যে মান ওপি দেখতে পাবে না, 3, বা 7. 0 সহস্রাংশ জায়গা আছে বৃত্তাকার হয় দেখতে পাবেন তাদের টেবিলে আপনার পরীক্ষার মান।
অ্যাডাম ওয়েঙ্গার

আপনি সঠিক. আমি ওপি প্রশ্নের উত্তর হিসাবে এটি পোস্ট করার অর্থ নয়, অন্যকে দেখার মতামত হিসাবে, তবে আমার কাছে কেবল 11 খ্যাতি পয়েন্ট ছিল এবং 15 টি মন্তব্য করার জন্য প্রয়োজন।
ব্রস্লাভ

আপনার প্রথম স্নিপেটে স্ট্রিং ধ্রুবকটি স্পষ্টভাবে ডেটটাইমে রূপান্তরিত হয়, আপনার দ্বিতীয়টিতে এটি একটি স্ট্রিং থেকে যায় (এবং ১১৩ সবেমাত্র উপেক্ষা করা হয়)।
অ্যান্ড্রি এম

2

প্রথম স্থানে সন্নিবেশ / আপডেটে স্ট্রিপ সময়। অন-ফ্লাই রূপান্তর হিসাবে, কোনও কিছুই ব্যবহারকারী-সংজ্ঞায়িত ফাংশনকে হ্রাস করতে পারে না

select date_only(dd)

এর বাস্তবায়ন date_onlyআপনার পছন্দ মতো কিছু হতে পারে - এখন এটি বিমূর্ত হয়ে গেছে এবং কলিং কোডটি অনেক বেশি পরিষ্কার।


আমি একবার নির্বাচিত কলামগুলি থেকে স্ক্রাব করার জন্য একটি ট্রিগার তৈরি করেছি। যদি ডেটাটি খারাপ না হতে পারে তবে আপনাকে এটি পরিষ্কার করতে হবে না।
ফিলিপ কেলি

2
ইউডিএফ পদ্ধতির একটি নেতিবাচক দিক রয়েছে, তারা SARGable নয়। JOINs বা WHERE ক্লজগুলিতে ব্যবহার করা হলে, অপটিমাইজার কর্মক্ষমতা উন্নত করতে INDEXes ব্যবহার করতে পারে না। DATEADD / DATEDIFF পদ্ধতির ব্যবহারটি অবশ্য SARGable এবং INDEXes থেকে উপকৃত হতে সক্ষম হবে। (স্পষ্টতই ফ্লোট পদ্ধতিটিও সারগেইবল)
ম্যাটবাইলি

1
@ ম্যাটবাইলি আমি আলাদা হতে অনুরোধ করছি! ইউডিএফগুলি অবশ্যই SARGable নয়, তবে ডেটাড্ড হয় না এবং ভাসতে রূপান্তরও হয় না! WHERE DateAdd(DateDiff(Column)) = @DateValueকোনও সূচক ব্যবহার করবে না। অন্যদিকে, WHERE Column >= dbo.UDF(@DateValue) AND Column < dbo.UDF(@DateValue + 1) হয় SARGable। সুতরাং আপনি এটি কীভাবে রাখছেন সে সম্পর্কে সতর্কতা অবলম্বন করুন।
এরিক

2

এই প্রশ্নটি দেখুন:
আমি কীভাবে এসকিউএল সার্ভারে একটি ডেটটাইম ছেদ করতে পারি?

আপনি যাই করুন না কেন, স্ট্রিং পদ্ধতিটি ব্যবহার করবেন না । এটি আপনি এটি করতে পারেন সবচেয়ে খারাপ উপায় সম্পর্কে।


ধন্যবাদ, আমি ভেবেছিলাম এটি আগে জিজ্ঞাসা করা উচিত ছিল। যদিও আশ্চর্যজনক যে আমার পরীক্ষাগুলি নির্দেশ করেছে যে এসকেউএল সার্ভার ২০০৮-এ ডেটডিডি (ডিডি, ০, ডেটেডিফ (ডিডি, ০, গেটডিট ())) পদ্ধতির তুলনায় ভাসা পদ্ধতিটি আসলে 3.5.৩% কম হয়। আমি প্রতিটি পদ্ধতির জন্য বহুবার আমার পরীক্ষা চালিয়েছি এবং ডাটাবেস সার্ভারটি অন্য কোনও কিছুর জন্য অব্যবহৃত ছিল।
স্টিফেন পেরেলসন

আসুন আমরা কেবল এটিই বলি যে আমি যে কেউ বেঞ্চমার্কগুলি নিয়মিতভাবে এবং একটি অত্যন্ত বৈজ্ঞানিক উপায়ে তাদের কাজের অংশ হিসাবে করে তা প্রমাণ করে নি যে আমি করা বেঞ্চমার্ক সম্পর্কে সন্দেহবাদী pt এমনকি জিবিএন-র লিঙ্কটিতে টমাসের বেঞ্চমার্কের কিছু স্পষ্ট সমস্যা রয়েছে যখন আপনি এটি দেখেন। এটি এটিকে অগত্যা ভুল করে না, কেবল সংজ্ঞাবদ্ধ নয়। Castালাই / মেঝে / castালাই পদ্ধতিটি দীর্ঘ সময়ের জন্য গৃহীত দ্রুততম উপায় ছিল এবং আমার সন্দেহ হয় যে এটি একসময় নির্বিচারে সত্য ছিল। বলেছিল, আমি এটি নিয়ে পুনর্বিবেচনা শুরু করছি; বিশেষত স্কয়ার সার্ভার ২০০৮ এর জন্য, যেখানে এটি যাইহোক সম্পূর্ণ অপ্রয়োজনীয়।
জোয়েল কোহোর্ন

1
স্ট্রিং পদ্ধতিটি ব্যবহার করা, পড়া এবং মনে রাখা অত্যন্ত সহজ। সেগুলি খুব গুরুত্বপূর্ণ কারণ যা আমি মনে করি আপনি কম মূল্যায়ন করছেন!
বেন

1
@ জোয়েলকোহূর্ন, রূপান্তরিত স্টাইল 121 কে "ওডিবিসি ক্যানোনিকাল" বলা হয়। এটি কোলেশন বা লোকেলের সাথে আলাদা হয় না। স্ট্রিং ট্রিকটি বছর, বছর + মাস, দিন, ঘন্টা বা মিনিটে সাধারণকরণও সহজ।
বেন

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

2

ইতিমধ্যে জবাব দেওয়া হয়েছে কিন্তু অসুস্থ এটিও এখানে ফেলে দিন ... এটি অনুমানযুক্তভাবেও ভাল কার্য সম্পাদন করে তবে এটি দশমিক (যা সময় সংরক্ষণ করে) থেকে ফেলে দেয় এবং কেবল পুরো অংশটি (যা তারিখ হয়) ফেরত দিয়ে কাজ করে

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

দ্বিতীয়বার আমি এই সমাধানটি পেয়েছি ... আমি এই কোডটি বন্ধ করে দিয়েছি


1
ফ্লোটে রূপান্তর করা নিরাপদ নয়
এরিক

2
CAST(round(cast(getdate()as real),0,1) AS datetime)

এই পদ্ধতিটি স্ট্রিং ফাংশন ব্যবহার করে না। Dateদশমিক এক দিনের ভগ্নাংশের আগে মূলত অঙ্কগুলির সাথে একটি আসল ডেটাটাইপ।

এটি আমার ধারণা অনেক বেশি দ্রুত হবে।


1
ভাসা হিসাবে কাস্ট করা নিরাপদ নয়
এরিক


2

কনভার্ট (চার (10), getDate (), 126) নির্বাচন করুন


পদ্ধতি @ broslav এর উত্তরে বা পদ্ধতি যে হিসাবে নির্ধারিত ছিল থেকে উল্লিখিত থেকে আপনার পরামর্শের প্রধান পার্থক্য কি ধীরতম মধ্যে এই থ্রেড (গৃহীত উত্তরে হিসাবে একই লিংক)?
অ্যান্ড্রি এম

1

আমার মনে হয় তুমি বোঝাতে চাইছ cast(floor(cast(getdate()as float))as datetime)

আসলটি কেবল 32-বিট, এবং কিছু তথ্য হারাতে পারে

এটি দ্রুততম cast(cast(getdate()+x-0.5 as int)as datetime)

... যদিও প্রায় 10% দ্রুত(about 0.49 microseconds CPU vs. 0.58)

এটি সুপারিশ করা হয়েছিল, এবং এখনই আমার পরীক্ষায় একই সময় নেয়: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

এসকিউএল ২০০৮-এ, এসকিউএল সিএলআর ফাংশনটি একটি এসকিউএল ফাংশনটি ব্যবহারের চেয়ে প্রায় 5 গুণ বেশি গতিবেগের সাথে, ১.৩৫ মাইক্রোসেকেন্ড বনাম .5.৫ মাইক্রোসেকশন, একটি সাধারণ এসকিউএল ইউডিএফ বনাম এসকিউএল সিএলআর ফাংশনটির জন্য অনেক কম ফাংশন-কল ওভারহেড নির্দেশ করে।

এসকিউএল 2005-এ, এসকিউএল সিএলআর ফাংশনটি আমার ধীরে ধীরে এই ধরণের ফাংশনটির তুলনায় আমার পরীক্ষার চেয়ে 16 গুণ দ্রুত হয়:

create function dateonly (  @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end

1

কীভাবে select cast(cast my_datetime_field as date) as datetime)? এটি 00:00 সময় নির্ধারিত সময়ের সাথে একই তারিখে ফলাফল দেয় তবে পাঠ্যে কোনও রূপান্তর এড়াতে এবং কোনও স্পষ্ট সংখ্যাসূচক বৃত্তিকে এড়িয়ে যায়।



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

প্রথমটি হুবহু একই রকম।
মিকেল এরিকসন

ঠিক আছে, হ্যাঁ, আমি এখন এটি দেখতে পাচ্ছি। আমি আমার উত্তরটি সদৃশ হিসাবে নকল হিসাবে অপসারণ করতে পেরে খুশি হব।
ডঃ ড্রু

1

আমি মনে করি যে আপনি যদি কঠোরভাবে এটির সাথে দৃ if TSQL়ভাবে অবস্থান করেন তবে সময় কেটে দেওয়ার এটি সবচেয়ে দ্রুততম উপায়:

 select convert(datetime,convert(int,convert(float,[Modified])))

আমি এই কাটা পদ্ধতিটি পদ্ধতির চেয়ে প্রায় 5% দ্রুত গতিতে পেয়েছি DateAdd। এবং এটি সহজেই এর মতো নিকটতম দিনে গোল করে পরিবর্তন করা যেতে পারে:

select convert(datetime,ROUND(convert(float,[Modified]),0))

ফ্লোটে রূপান্তর করা নিরাপদ নয়
এরিক

1

এখানে আমি এসকিউএল সার্ভারের জন্য ডেটটাইমের কিছু অংশ সরিয়ে ফাংশন করেছি। ব্যবহার:

  • প্রথম পরম হ'ল তারিখের সময়টি কেটে ফেলা হবে।
  • দ্বিতীয় পরম একটি চর:
    • s: রাউন্ড টু সেকেন্ড; মিলিসেকেন্ড সরিয়ে দেয়
    • মি: রাউন্ড থেকে মিনিট; সেকেন্ড এবং মিলিসেকেন্ড সরিয়ে দেয়
    • এইচ: রাউন্ড টু ঘন্টা; মিনিট, সেকেন্ড এবং মিলিসেকেন্ড সরিয়ে দেয়।
    • d: রাউন্ড টু ডে; ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ড সরিয়ে দেয়।
  • নতুন তারিখের সময় ফেরত দেয়

create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end


থ্যাঙ্কস অ্যান্ড্রি! আমি জানতাম না আমার সুপারিশটি এতটা দক্ষ ছিল না। কমপক্ষে এটি কাজ করে তবে আপনি ঠিক বলেছেন।
ম্যাক্স ভার্গাস

1

উপরের বেশ কয়েকটি সংস্করণ কাজ না করায় যেহেতু কেউ এখানে সায়ব্যাস সংস্করণ খুঁজছেন

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
  • অ্যাডাপটিভ সার্ভার 15.7 এ চলমান আই এসকিউএল ভি 11-তে পরীক্ষা করা হয়েছে

এটি গৃহীত উত্তরের সম্পাদনা হিসাবে আরও ভাল ফিট। আরও 20 টি উত্তরের সাথে এটি সমাহিত করা হবে এবং অবিশ্বাস্যর কাছে চলে আসবে। এছাড়াও স্বীকৃত উত্তরটি ব্যবহারের উল্লেখ করে cast: এসকিউএল সার্ভার ২০০৮+ এর জন্য, আপনি আজ পর্যন্ত কাস্ট করতে পারেন। অথবা কেবল তারিখটি ব্যবহার করুন যাতে অপসারণের সময় নেই।
EWit

সমতুল্য সিবেস প্রশ্নের উত্তর হিসাবে এটি পোস্ট করা ভাল। যদি এরকম কোনও প্রশ্ন না থাকে তবে আপনি একটি তৈরি করতে মুক্ত (এবং নিজেই উত্তর দিন)।
অ্যান্ড্রি এম

এছাড়া, এটা যখন আপনি একটি রূপান্তর করছি রূপান্তর করতে একটি তৃতীয় প্যারামিটারটি উল্লেখ করার অর্থহীন হয় datetimeথেকে date: তন্ন তন্ন যারা একটি সহজাত বিন্যাস হয়েছে।
অ্যান্ড্রি এম

0

যদি সম্ভব হয় তবে এর মতো বিশেষ জিনিসের জন্য আমি সিএলআর ফাংশন ব্যবহার করতে চাই।

এক্ষেত্রে:

[Microsoft.SqlServer.Server.SqlFunction]
    public static SqlDateTime DateOnly(SqlDateTime input)
    {
        if (!input.IsNull)
        {
            SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);

            return dt;
        }
        else
            return SqlDateTime.Null;
    }

0

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

প্রকৃতপক্ষে, আমি তৈরি করি এমন বেশিরভাগ ডাটাবেসের জন্য, আমি এই ইউডিএফ এর শুরুতে ঠিকই যুক্ত করি যেহেতু আমি জানি যে খুব শীঘ্রই বা পরে তাদের প্রয়োজন হওয়ার 99% সুযোগ রয়েছে।

আমি "কেবলমাত্র তারিখ" এবং "কেবলমাত্র সময়" এর জন্য একটি তৈরি করি (যদিও "কেবলমাত্র তারিখ" এর মধ্যে দু'জনের মধ্যে সবচেয়ে বেশি ব্যবহৃত হয়)।

বিভিন্ন তারিখ-সম্পর্কিত ইউডিএফ-এর কয়েকটি লিঙ্ক এখানে রয়েছে:

প্রয়োজনীয় এসকিউএল সার্ভারের তারিখ, সময় এবং তারিখের কাজগুলি কেবল তারিখের কার্যকারিতা
পান

এই শেষ লিঙ্কটি তারিখের সময় ক্ষেত্রের কেবলমাত্র অংশ পাওয়ার জন্য 3 টিরও কম উপায় দেখায় না এবং প্রতিটি পদ্ধতির কিছু উপকারিতা এবং বিভক্তি উল্লেখ করে।

যদি কোনও ইউডিএফ ব্যবহার করে থাকে তবে এটি লক্ষ করা উচিত যে আপনার প্রশ্নের কোনও উত্তরের অংশ হিসাবে ইউডিএফ ব্যবহার করা এড়ানো উচিত কারণ এটি ক্যোয়ারের কার্যকারিতাকে ব্যাপকভাবে বাধা দেবে। এর মূল কারণ হ'ল যেখানে একটি ক্লজটিতে ইউডিএফ ব্যবহার করা সেই ধারাটিকে অ-সরগেবল হিসাবে রেন্ডার করে , যার অর্থ এসকিউএল সার্ভার আর এই ধারাটির সাথে কোনও সূচক ব্যবহার করতে পারে না যাতে ক্যোয়ারি এক্সিকিউশনের গতি উন্নতি করতে পারে। আমার নিজের ইউডিএফ-এর ব্যবহারের প্রসঙ্গে, আমি প্রায়শই WHERE ধারাটির মধ্যে "কাঁচা" তারিখ কলামটি ব্যবহার করব, তবে নির্বাচিত কলামে UDF প্রয়োগ করব। এইভাবে, ইউডিএফ কেবল ফিল্টার করা ফলাফল-সেটটিতে প্রয়োগ করা হয় এবং ছকটির প্রতিটি সারি ফিল্টারের অংশ হিসাবে নয়।

অবশ্যই, এর জন্য নিখুঁত সর্বোত্তম পন্থা হ'ল এসকিউএল সার্ভার ২০০৮ (বা তার চেয়েও বেশি) ব্যবহার করা এবং আপনার তারিখ এবং সময়গুলি আলাদা করা , কারণ এসকিউএল সার্ভার ডাটাবেস ইঞ্জিনটি পরে স্বতন্ত্র তারিখ এবং সময় উপাদান সরবরাহ করে এবং দক্ষতার সাথে এগুলিকে স্বাধীনভাবে জিজ্ঞাসা করতে পারে কোনও যৌগিক তারিখ টাইম থেকে তারিখ বা সময় অংশ বের করার জন্য কোনও ইউডিএফ বা অন্য প্রক্রিয়াটির প্রয়োজন ছাড়াই।


কোনও ইউডিএফ ব্যবহার করা কিছু পরিস্থিতিতে ভাল হতে পারে (যেমন প্যারামিটারগুলি স্ক্রাব করার সময়)। তবে বেশিরভাগ পরিস্থিতিতে এটি একটি ভয়াবহ সমাধান - প্রতিটি সারির জন্য একবার ইউডিএফ চালানো কোনও প্রয়োজনের কোনও প্রকার ছাড়াই কেবল কোনও অনুসন্ধানের পারফরম্যান্সকে মেরে ফেলার উপায় !
এরিক

@ এরিক - আমি একমত নই, এরিক, ইউডিএফ হ'ল পারফরম্যান্স কিলার, এ কারণেই আমি বলছি যে, আপনি যদি এসকিউএল সার্ভার ২০০৮ বা তার বেশি ব্যবহার করতে পারেন এবং একটি বিল্ট-ইন ডেটাটাইপ ব্যবহার করতে পারেন যা এটি আপনার জন্য করে, তবে এটিই সেরা সমাধান হতে পারে (যা প্রয়োজন তা অর্জনের দিক থেকে এবং পারফরম্যান্সের ক্ষেত্রে উভয়ই)। যদি আপনি এসকিউএল সার্ভারের পুরানো সংস্করণে আটকে থাকেন যা স্থানীয়ভাবে এটি সমর্থন করে না, আপনি আপনার প্রয়োজনীয়তা অর্জনের জন্য কিছু ত্যাগ করবেন ।
ক্রেগটিপি

সত্য। ডাটাবেস ইঞ্জিনটি যদি এমন কিছু দেয় যা SARGable, তবে প্রকাশ করা সহজ It ইতিমধ্যে, আপনি একটি সম্পূর্ণ দিনের বেলায় যে কোনো সময় যে কোনো মান খুঁজছেন, এই এখনও সবচেয়ে ভালো সমাধান (এসকিউএল অন্তত পুরোনো সংস্করণের জন্য) হল: WHERE DateColumn >= {TimeTruncatingExpression}(@DateValue) AND DateColumn < {TimeTruncatingExpression}(@DateValue + 1)। আমার মনে হয়েছিল আমার কিছু বলতে হবে যেহেতু আপনি বলেছিলেন যে "আমি প্রায় সর্বদা ইউডিএফ ব্যবহার করি" কোনও ত্রুটি ব্যাখ্যা করেনি, বা তারিখের একমাত্র ক্যোয়ারী SARGable করার উপায়ও ব্যাখ্যা করেনি।
এরিক

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

-4

আমি ব্যবহার করব:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
) 

সুতরাং ইতিমধ্যে কার্যকরভাবে তারিখের ক্ষেত্র থেকে একটি নতুন ক্ষেত্র তৈরি করুন।


2
তুমি ওটা কেন করবে? আপনি কি মনে করেন যে কোনও datetimeমান থেকে বিটগুলি বের করা , সেগুলিতে স্ট্রিংয়ে রূপান্তর করা, একত্রে একত্রিত করা এবং অবশেষে ফলাফলকে আবার রূপান্তর করা datetimeযেমন উদাহরণের datetime( DATEADD/ DATEDIFFপদ্ধতিতে) সরাসরি গণনা সম্পাদন করার চেয়ে ভাল ?
অ্যান্ড্রি এম

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