কীভাবে এসকিউএল সার্ভারের টাইমস্ট্যাম্প কলামকে ডেটটাইম ফর্ম্যাটে রূপান্তর করবেন


90

এসকিউএল সার্ভার যেমন টাইমস্ট্যাম্প রিটার্ন দেয় 'Nov 14 2011 03:12:12:947PM', 'ওয়াইএমডি এইচ: আই: এস' এর মতো স্ট্রিংটিকে ডেট ফর্ম্যাটে রূপান্তর করার কিছু সহজ উপায় আছে।

এখন পর্যন্ত আমি ব্যবহার

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))

উত্তর:


252

এসকিউএল সার্ভারের TIMESTAMPডেটাটাইপের কোনও তারিখ এবং সময় নিয়ে কোনও সম্পর্ক নেই !

এটি একটানা 8 বাইট পূর্ণসংখ্যার একটি হেক্সাডেসিমাল উপস্থাপনা - এটি পড়ার পরে কোনও সারি পরিবর্তিত হয়নি তা নিশ্চিত করার পক্ষে এটি কেবল ভাল।

আপনি হেক্সাডেসিমাল পূর্ণসংখ্যাটি পড়তে পারেন বা যদি চান তবে BIGINT। উদাহরণ হিসাবে:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

ফলাফল হলো

400756068

এসকিউএল সার্ভারের নতুন সংস্করণগুলিতে এটি বলা হচ্ছে RowVersion- যেহেতু এটি আসলেই তাই। রাউভারশনে এমএসডিএন ডক্স দেখুন :

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

সুতরাং আপনি কোনও এসকিউএল সার্ভারকে একটি তারিখ / সময় রূপান্তর করতে পারবেন নাTIMESTAMP - এটি কেবল তারিখ / সময় নয়।

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

আপনি যে ফর্ম্যাটটির সন্ধান করছেন সেটি দেখতে কিছুটা ওডিসিবি আড়ম্বরপূর্ণ (স্টাইল = 121):

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

দেয়:

2011-11-14 10:29:00.470

এসকিউএল সার্ভার ২০১২-এর শেষ পর্যন্তFORMAT কাস্টম ফর্ম্যাট করার জন্য একটি ফাংশন থাকবে ......


4
সম্ভবত এসকিউএল সার্ভারের সাথে আমার বৃহত্তম পীভ। আমি যদি এর সাথে সময়টি না বলতে পারি তবে কেন এটি একটি টাইমস্ট্যাম্প বলবে?
বেলগোকানাডিয়ান

4
@ বেলগোকানাডিয়ান: সিবাজকে জিজ্ঞাসা করুন - এটি এমন একটি বৈশিষ্ট্য যা চিরকাল
সিবাজ

4
@BelgoCanadian আপনি এটা জেনে খুশি এখন rowversion বলা হয় হওয়া উচিত docs.microsoft.com/en-us/sql/t-sql/data-types/...
জেসন এস

আছে TIMESTAMPটাইপ কলাম
Ghilteras

4

এটি করার সহজ উপায় হ'ল:

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;

এটি পঠনযোগ্য ফর্ম্যাটে অন্ততপক্ষে তারিখের কলাম দেয়। আপনি যদি তে ফরমেট পরিবর্তন করতে চান তবে এখানে ক্লিক করুন


11
প্রশ্নটি এসকিউএল সার্ভার, মাইএসকিউএল নয়
মাইক এম

4

কাস্ট ব্যবহার করে আপনি টাইমস্ট্যাম্প ক্ষেত্র থেকে তারিখ পেতে পারেন:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
এটি কাজ করছে বলে মনে হচ্ছে না:Explicit conversion from data type timestamp to date is not allowed.
জোকুল

খারাপ ধারণা। টাইমস্ট্যাম্প ক্ষেত্রটি কেবল একটি ক্রম। আপনি ভাগ্যবান হতে পারেন এবং একটি তারিখ পেতে পারেন, কিন্তু তারিখটির কোনও অর্থ হবে না। আপনি যদি হেক্সের চেয়ে দশমিক সংখ্যা চান তবে আপনার বিগিন্টে কাস্ট করা উচিত। টাইমস্ট্যাম্প এখন rowversion বলা হয় docs.microsoft.com/en-us/sql/t-sql/data-types/...
জেসন এস

3

আমার সহকর্মীরা আমাকে এতে সহায়তা করেছেন:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);

বা

select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);

3

এই বার্তা ব্যতীত, দুর্দান্ত কাজ করে:

ডেটা টাইপ বারচার থেকে টাইমস্ট্যাম্পে অন্তর্নিহিত রূপান্তর অনুমোদিত নয়। এই কোয়েরিটি চালানোর জন্য কনভার্ট ফাংশনটি ব্যবহার করুন

সুতরাং হ্যাঁ, TIMESTAMP( RowVersion) কোনও তারিখ নয় :)

সত্যি কথা বলতে কি, আমি এটিকে একটি তারিখে রূপান্তর করার উপায় খুঁজতে নিজেকে বেশ কিছুটা সময় বেঁধে ফেলেছিলাম।

সেরা রূপটি এটিকে রূপান্তর করা INTএবং তুলনা করা। এই ধরণের হতে বোঝানো হয়।

আপনি যদি একটি তারিখ চান - কেবল একটি Datetimeকলাম যুক্ত করুন এবং সুখীভাবে পরে বাস করুন :)

চিয়ার্স ম্যাক


4
বা বিগিন্ট যেহেতু এটি 8 বাইট হয়
জেসন এস

2

"আপনি এই শব্দটি ব্যবহার করে চলেছেন। আমি মনে করি না এটির অর্থ যা বোঝায় এটির অর্থ।" - ইনিগো মন্টোয়া

টাইমস্ট্যাম্পটির সাথে সময়ের সাথে একেবারেই কোনও সম্পর্ক নেই যেমন মারক_সগুলি মূলত বলেছিল।

declare @Test table (
     TestId int identity(1,1) primary key clustered
    ,Ts     timestamp
    ,CurrentDt datetime default getdate()
    ,Something varchar(max)
)

insert into @Test (Something)
    select name from sys.tables
waitfor delay '00:00:10'

insert into @Test (Something)
    select name from sys.tables

select * from @Test

আউটপুটে লক্ষ্য করুন যে টিএস (হেক্স) প্রতিটি রেকর্ডের জন্য এক এক করে বৃদ্ধি পেয়েছে, তবে আসল সময়ের ব্যবধানটি 10 ​​সেকেন্ডের মধ্যে রয়েছে। যদি এটি সময়ের সাথে সম্পর্কিত ছিল তবে সময়ের পার্থক্যের সাথে মিল রেখে টাইমস্ট্যাম্পে একটি ফাঁক থাকবে।


0

টাইমস্ট্যাম্প হিসাবে পূর্ণসংখ্যার কনভার্ট (বিগিন্ট, [টাইমস্ট্যাম্প]) এ রূপান্তরকরণের নিষেধাজ্ঞার পরে আমি ফলাফলটি পেয়েছি

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

হ্যাঁ, এটি কোনও তারিখ এবং সময় নয়, এটি ক্রমিক সংখ্যা



0

টাইমস্ট্যাম্পের সাথে আমার একই সমস্যা ছিল যেমন: '29 -JUL-20 04.46.42.000000000 PM '। আমি এটিকে 'yyyy-MM-dd' ফর্ম্যাটে পরিণত করতে চেয়েছিলাম। অবশেষে আমার জন্য যে সমাধানটি কাজ করে তা হ'ল

MyTable থেকে TO_CHAR (মাইটাইমস্ট্যাম্প, 'YYYY-MM-DD') নির্বাচন করুন;


0

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

এর সাথে কাজ করা যাক:

CAST(0x0000A61300B1F1EB AS DateTime)

এই হেক্স উপস্থাপনাটি আসলে দুটি পৃথক ডেটা উপাদান ... তারিখ এবং সময়। প্রথম চার বাইট তারিখ, দ্বিতীয় চার বাইট সময়।

  • তারিখ 0x0000A613
  • সময়টি 0x00B1F1EB

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

  • 0x0000A613 তারিখটি 42515 হয়
  • 0x00B1F1EB এর সময় 11661803 হয়

এখন, সেই পূর্ণসংখ্যার সাথে কী করবেন:

তারিখ

তারিখটি 01/01/1900 সাল থেকে এবং দিন হিসাবে প্রতিনিধিত্ব করা হয়। সুতরাং, 01/01/1900 এ 42,515 দিন যুক্ত করুন এবং আপনার ফলাফলটি 05/27/2016।

সময়

সময়টা একটু বেশি জটিল। মধ্যরাত (সিউডোকোড) থেকে মাইক্রোসেকেন্ডে আপনার সময় পেতে নিম্নলিখিত আইএনটি নিন এবং নিম্নলিখিতগুলি করুন:

TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3

সেখান থেকে আপনার ভাষার প্রিয় ফাংশন কলগুলি মাইক্রোসেকেন্ডগুলি (3887267666666.7 above এস উদাহরণস্বরূপ উদাহরণস্বরূপ) সময় মতো অনুবাদ করতে ব্যবহার করুন।

ফলাফল 10: 47: 52.677 হবে


-1

তাদের মধ্যে কিছু এসকিউএল সার্ভার ২০০৮ থেকে ডেট-টাইমে আসলে গোপন করে পর ।

নিম্নলিখিত এসকিউএল ক্যোয়ারী ব্যবহার করে দেখুন এবং আপনি নিজেরাই দেখতে পাবেন:

SELECT CAST (0x00009CEF00A25634 AS datetime)

উপরের ফলাফল হবে 2009-12-30 09:51:03:000কিন্তু আমি এমন একটি মুখোমুখি হয়েছি যা আসলে কোনও তারিখের সময় মানচিত্র করে না।


4
এটা করবেন না। আপনি ভাগ্যবান এবং রূপান্তর পেতে পারেন তবে তারিখের সময়টি অর্থহীন এবং বিভ্রান্তিমূলক হবে। টাইমস্ট্যাম্পটি কেবল একটি সিক্যুয়েন্স নম্বর এবং এখন সারি সংস্করণ ডকস.মাইক্রোসফট /en-us/sql/t-sql/data-types/… বলা হয় । আপনি যদি একটি দশমিক সংখ্যা চান তবে সবেমাত্র BIGINT
জেসন এস


-3

আমি এখানে কিছু মিস করছি কিনা তা নিশ্চিত নন তবে আপনি কেবল টাইমস্ট্যাম্পকে এভাবে রূপান্তর করতে পারবেন না:

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)

আপনি কি এই চেষ্টা করেছেন? DATE এর সাথে TIMESTAMP এর কোনও সম্পর্ক নেই।
শান পিয়ার্স

আমি এটি এসকিউএল সার্ভার ২০০৮
ড্যানিয়েল

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