কিভাবে একটি SQL সার্ভার DateTime ডেটাটাইপ থেকে শুধুমাত্র তারিখ ফেরত দিতে




sql-server tsql (20)

SELECT GETDATE()

রিটার্নস: 2008-09-22 15:24:13.790

আমি সময় অংশ ছাড়া যে তারিখ অংশ চান: 2008-09-22 00:00:00.000

আমি কিভাবে যে পেতে পারি?


আপনি যদি SQL সার্ভার 2012 বা উপরের সংস্করণ ব্যবহার করেন ,

Format() ফাংশন ব্যবহার Format()

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

FORMAT ( value, format [, culture ] )

সংস্কৃতির বিকল্পটি খুব দরকারী, আপনি আপনার দর্শকদের অনুসারে তারিখ নির্দিষ্ট করতে পারেন।

আপনি ডি (ছোট নিদর্শন জন্য) এবং ডি (দীর্ঘ নিদর্শন জন্য) মনে আছে।

1. "ডি" - সংক্ষিপ্ত তারিখ প্যাটার্ন।

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. "ডি" - দীর্ঘ তারিখ প্যাটার্ন।

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

প্রশ্নের আরো উদাহরণ।

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011101

আপনি আরও ফরম্যাট চান, আপনি যেতে পারেন:

  1. স্ট্যান্ডার্ড তারিখ এবং সময় বিন্যাস স্ট্রিং
  2. কাস্টম তারিখ এবং সময় বিন্যাস স্ট্রিং

Floor () ব্যবহার করে - শুধু সময় অংশ কাটা।

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

আপনি DATE_FORMAT (your_datetiem_column, '% d-% m-% Y') ব্যবহার করেন না কেন?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

আপনি '%d-%m-%Y' অংশটি পুনরায় সংগঠিত করে m, d এবং year এর ক্রম পরিবর্তন করতে পারেন


আপনি তারিখ অংশ এবং তারিখ বিন্যাস জন্য নিম্নলিখিত ব্যবহার করতে পারেন:

DATENAME => একটি অক্ষর স্ট্রিং প্রদান করে যা নির্দিষ্ট তারিখের নির্দিষ্ট তারিখের প্রতিনিধিত্ব করে

DATEADD => DATEPART() ফাংশনটি তারিখ / সময়, যেমন বছরের, মাস, দিন, ঘন্টা, মিনিট, ইত্যাদির একক অংশ ফেরত দিতে ব্যবহৃত হয়।

DATEPART => একটি পূর্ণসংখ্যা প্রদান করে যা নির্দিষ্ট তারিখের নির্দিষ্ট তারিখের প্রতিনিধিত্ব করে।

CONVERT() => CONVERT() ফাংশন একটি সাধারণ ফাংশন যা একটি ডাটা টাইপের অন্য একটি অভিব্যক্তি রূপান্তর করে। CONVERT() ফাংশনটি বিভিন্ন ফর্ম্যাটে তারিখ / সময় তথ্য প্রদর্শন করতে ব্যবহার করা যেতে পারে।


আপনি যদি কলাম বা পরিবর্তনশীল ফলাফলটি বরাদ্দ করেন তবে এটি DATE টাইপ দিন এবং রূপান্তরটি অন্তর্নিহিত।

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

আপনি শুধুমাত্র তারিখ ফেরত CONVERT ফাংশন ব্যবহার করতে পারেন। নীচের লিঙ্কটি দেখুন:

SQL সার্ভার 2000 এ তারিখ এবং সময় ম্যানিপুলেশন

কাস্ট এবং কনভার্টার

রূপান্তর ফাংশন ব্যবহার করার জন্য সিনট্যাক্স হল:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

আমি উল্লিখিত নিম্নলিখিত যা অনুগ্রহ করে:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

এটি স্থানীয় সম্পর্কেও যত্ন করে না বা দ্বৈত রূপান্তর করে না - যদিও প্রতিটি 'datepart' সম্ভবত গণিত করে। সুতরাং এটি ডেটিফ পদ্ধতির চেয়ে একটু ধীর হতে পারে, তবে আমার কাছে এটি আরও স্পষ্ট। বিশেষ করে যখন আমি কেবল বছর এবং মাস দ্বারা গ্রুপ করতে চান (দিনটি 1 সেট করুন)।


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

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

উপরের বিবৃতিটি আপনার বর্তমান বিন্যাস YYYY/MM/DD রূপান্তর করে, আপনার পছন্দসই বিন্যাসটি নির্বাচন করার জন্য দয়া করে এই লিঙ্কটি পড়ুন।


এমনকি প্রাচীন এমএসকিউএল সার্ভার 7.0 ব্যবহার করে, এখানে কোড (এই link সৌজন্যে) আমাকে যে কোনও তারিখের ফর্ম্যাটটি সন্ধান করতে অনুমতি দিয়েছে:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

এটি এই আউটপুট উত্পাদিত:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

এসকিউএল সার্ভার 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

ঠিক আছে, আমি একটু দেরী হলেও :), এখানে আরেকটি সমাধান।

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

ফল

2008-09-22 00:00:00.000

এবং যদি আপনি SQL Server 2012 এবং তারপরে উচ্চতর ব্যবহার করেন তবে আপনি FORMAT() ফাংশন ব্যবহার করতে পারেন -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

তারিখ:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

সময়:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

মার্চএডিডি এবং ডেটাডাইফ Varchar থেকে কনভার্টিং চেয়ে ভাল। উভয় প্রশ্নের একই নির্বাহ পরিকল্পনা আছে, কিন্তু মৃত্যুদন্ড পরিকল্পনা প্রাথমিকভাবে তথ্য অ্যাক্সেস কৌশল সম্পর্কে এবং সর্বদা সমস্ত টুকরা সঞ্চালিত CPU খরচ জড়িত অন্তর্নিহিত খরচ প্রকাশ করবেন না। যদি উভয় প্রশ্ন লক্ষ লক্ষ সারির সাথে একটি টেবিলের বিপরীতে চালানো হয়, তবে ডেটাডিফ ব্যবহার করে CPU সময়টি রূপান্তরযোগ্য CPU সময় 1/3 এর কাছাকাছি হতে পারে!

প্রশ্নের জন্য নির্বাহ পরিকল্পনা দেখতে:

set showplan_text on
GO 

DATEADD এবং DATEDIFF উভয় একটি CONVERT_IMPLICIT কার্যকর করবে।

যদিও CONVERT সমাধান কিছু সহজ এবং সহজ পড়তে সহজ, এটি ধীর। ডেটটাইমে ফিরে যাওয়ার কোন প্রয়োজন নেই (এটি সার্ভারের দ্বারা নিখুঁতভাবে সম্পন্ন)। তারিখের জন্য DateDiff পদ্ধতিতে কোনও প্রকৃত প্রয়োজন নেই, পরে পূর্ণসংখ্যা ফলাফলটি সম্পূর্ণরূপে ডেটাটাইম রূপে রূপান্তরিত হবে।

তারিখ কনভার্ট (Varchar, MyDate, 101) তারিখগুলি থেকে

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

DATEADD নির্বাচন করুন (ডিডি, 0, DATEDIFF (ডিডি, 0, MyDate)) তারিখ তারিখ থেকে

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

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

ছেলেরা মনে রাখুন: কেউ বিশ্বাস করবেন না। কর্মক্ষমতা পরিসংখ্যান তাকান, এবং এটি নিজের পরীক্ষা!

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

ক্যাশ অপ্টিমাইজেশান প্রশ্ন প্রভাবিত করে যখন কিছু মানুষের জন্য বিভ্রান্তি বলে মনে হচ্ছে। একই ব্যাচের দুটি বা দুটি পৃথক ব্যাচগুলিতে ক্যাশিংয়ের কোন প্রভাব নেই। তাই আপনি নিজে ক্যাশের মেয়াদ শেষ করতে পারেন অথবা কেবলমাত্র একাধিকবার প্রশ্নগুলি চালাতে পারেন। কোয়েরি # 2 এর জন্য যেকোনো অপ্টিমাইজেশান পরবর্তী কোনও প্রশ্নগুলিতে প্রভাবিত করবে, তাই যদি আপনি চান তাহলে # 1 নির্বাহটি বের করুন।

এখানে সম্পূর্ণ পরীক্ষা স্ক্রিপ্ট এবং কর্মক্ষমতা ফলাফল প্রমাণ করে যে DateDiff ভার্চারে রূপান্তর করার চেয়ে যথেষ্ট দ্রুত।


যদি আপনি CONVERT ব্যবহার করতে চান এবং একই CONVERT(varchar(10),[SourceDate as dateTime],121) তখন CONVERT(varchar(10),[SourceDate as dateTime],121) পূর্ববর্তী দম্পতির উত্তর হিসাবে একই কোডটি ব্যবহার করুন। , কিন্তু ড্যাশ সহ yyyy-mm-dd রূপান্তর করার কোড 121।

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

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


শুধু আপনি এই ভাবে করতে পারেন:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

আউটপুট হিসাবে:

2008-09-22 00:00:00.000

অথবা সহজভাবে এই মত করবেন:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

ফলাফল:

Date Part Only
--------------
2013-07-14

SQL Server 2008 এবং উচ্চতর উপর, আপনি তারিখ পর্যন্ত CONVERT করা উচিত:

SELECT CONVERT(date, getdate())

পুরোনো সংস্করণগুলিতে, আপনি নিম্নলিখিতগুলি করতে পারেন:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

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

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

আমাকে দেয়

2008-09-22 00:00:00.000

পেশাদাররা:

  • কোন varchar <-> datetime রূপান্তর প্রয়োজন
  • locale সম্পর্কে চিন্তা করার প্রয়োজন নেই

তারিখ বিন্যাসে ফেরত জন্য

CAST (অর্ডার তারিখ হিসাবে তারিখ)

উপরের কোড SQL সার্ভার 2010 কাজ করবে

এটা 12/12/2013 মত ফিরে হবে

এসকিউএল সার্ভার 2012 জন্য নীচের কোড ব্যবহার করুন

CONVERT(VARCHAR(10), OrderDate , 111)

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

সম্পাদনা: প্রথম দুটি পদ্ধতি অপরিহার্যভাবে একই, এবং আউট Varchar পদ্ধতি রূপান্তর সঞ্চালন।







datetime