SQL Server के टाइमस्टैम्प कॉलम को डेटाइम फॉर्मेट में कैसे बदलें


88

जैसे कि SQL सर्वर टाइमस्टैम्प को लौटाता है 'Nov 14 2011 03:12:12:947PM', क्या स्ट्रिंग को डेट फॉर्मेट में बदलने का कुछ आसान तरीका है जैसे 'Ymd H: i: s'।

अब तक मैं उपयोग करता हूं

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

जवाबों:


250

SQL सर्वर के TIMESTAMPडेटाटाइप का किसी तिथि और समय से कोई लेना- देना नहीं है!

यह लगातार 8 बाइट पूर्णांक का केवल एक हेक्साडेसिमल प्रतिनिधित्व है - यह केवल यह सुनिश्चित करने के लिए अच्छा है कि जब से यह पढ़ा गया है तब तक कोई पंक्ति नहीं बदलती है।

आप हेक्साडेसिमल पूर्णांक को पढ़ सकते हैं या यदि आप चाहते हैं कि ए BIGINT। उदहारण के लिए:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

परिणाम है

400756068

SQL सर्वर के नए संस्करणों में, इसे कहा जा रहा है RowVersion- क्योंकि यह वास्तव में यही है। ROWVERSION पर MSDN डॉक्स देखें :

एक डेटा प्रकार एक डेटाबेस के भीतर स्वचालित रूप से उत्पन्न, अद्वितीय बाइनरी नंबर को उजागर करता है। rowversion का उपयोग आमतौर पर संस्करण-स्टैंपिंग टेबल पंक्तियों के लिए एक तंत्र के रूप में किया जाता है। रोवरवर्जन डेटा प्रकार सिर्फ एक वृद्धि की संख्या है और एक तिथि या समय को संरक्षित नहीं करता है । दिनांक या समय रिकॉर्ड करने के लिए, डेटाटाइम 2 डेटा प्रकार का उपयोग करें।

इसलिए आप किसी SQL सर्वर को दिनांक / समय में परिवर्तित नहीं कर सकतेTIMESTAMP - यह सिर्फ एक दिनांक / समय नहीं है।

लेकिन अगर आप टाइमस्टैम्प कह रहे हैं, लेकिन वास्तव में आपका मतलब एक DATETIMEकॉलम है - तो आप MSDN मदद में CAST और CONVERT विषय में वर्णित किसी भी मान्य दिनांक प्रारूप का उपयोग कर सकते हैं। जिन्हें SQL सर्वर द्वारा "आउट ऑफ द बॉक्स" परिभाषित और समर्थित किया गया है। किसी भी चीज का समर्थन नहीं किया जाता है, उदाहरण के लिए आपको बहुत सारे मैनुअल कास्टिंग और कंक्रीटिंग (अनुशंसित नहीं) करना होगा।

आप जिस प्रारूप की तलाश कर रहे हैं वह ODBC विहित (शैली = 121) की तरह दिखता है :

DECLARE @today DATETIME = SYSDATETIME()

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

देता है:

2011-11-14 10:29:00.470

SQL सर्वर 2012 अंत मेंFORMAT कस्टम स्वरूपण करने के लिए एक समारोह होगा ......


5
शायद SQL सर्वर के साथ मेरा सबसे बड़ा पेशाब। अगर मैं इसके साथ समय नहीं बता सकता तो इसे टाइमस्टैम्प क्यों कहें?
बेल्गोकेनडियन

1
@BelgoCanadian: Sybase से पूछें - यह एक ऐसी सुविधा है जो Sybase / SQL सर्वर में हमेशा के लिए है .....
marc_s

1
@BelgoCanadian आपको यह जानकर ख़ुशी होनी चाहिए कि अब इसे पंक्ति- रूपांतरण docs.microsoft.com/en-us/sql/t-sql/data-types/…
जेसन एस

देखते हैं TIMESTAMPप्रकार स्तंभों
Ghilteras

4

ऐसा करने का सबसे सरल तरीका है:

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

यह पढ़ने योग्य प्रारूप में दिनांक स्तंभ को कम से कम देता है। इसके अलावा यदि आप टी प्रारूप को बदलना चाहते हैं तो यहां क्लिक करें


11
प्रश्न SQLServer है, MySQL नहीं
माइक एम

4

कलाकारों का उपयोग कर आप एक टाइमस्टैम्प क्षेत्र से तारीख प्राप्त कर सकते हैं:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
: यह करने के लिए काम नहीं लगता हैExplicit conversion from data type timestamp to date is not allowed.
jocull

बुरा विचार। टाइमस्टैम्प क्षेत्र केवल एक अनुक्रम है। आप भाग्यशाली हो सकते हैं और एक तारीख प्राप्त कर सकते हैं, लेकिन तारीख का कोई मतलब नहीं होगा। यदि आपको हेक्स के बजाय दशमलव संख्या चाहिए, तो आपको BIGINT को कास्ट करना चाहिए। टाइमस्टैम्प को अब रॉवर्सन डॉक्स
जेसन एस

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

इस संदेश को छोड़कर, ठीक काम करता है:

डेटा प्रकार के varchar से टाइमस्टैम्प में अनुमानित रूपांतरण की अनुमति नहीं है। इस क्वेरी को चलाने के लिए CONVERT फ़ंक्शन का उपयोग करें

तो हाँ, TIMESTAMP( RowVersion) एक दिनांक नहीं है :)

ईमानदार होने के लिए, मैंने इसे किसी तारीख में बदलने का तरीका खोजने के लिए खुद कुछ समय के आसपास फिदा किया।

सबसे अच्छा तरीका यह है कि इसे कन्वर्ट INTकरें और तुलना करें। इस प्रकार का यही अर्थ है।

यदि आप एक तारीख चाहते हैं - बस एक Datetimeकॉलम जोड़ें और उसके बाद खुशी से जीएं :)

चीयर्स मैक


1
या BIGINT चूंकि यह 8 बाइट्स है
जेसन S

2

"आप उस शब्द का उपयोग करते रहते हैं। मुझे नहीं लगता कि इसका मतलब है कि आप क्या सोचते हैं।" - इनिगो मोंटोया

टाइमस्टैम्प वास्तव में समय के लिए कोई संबंध नहीं है जैसा कि मूल रूप से marc_s ने कहा है।

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

आउटपुट में नोटिस करें कि प्रत्येक रिकॉर्ड के लिए Ts (हेक्स) एक से बढ़ कर है, लेकिन वास्तविक समय में 10 सेकंड का अंतर है। यदि यह समय से संबंधित होता तो समय में अंतर के साथ मेल खाने के लिए टाइमस्टैम्प में अंतराल होता।


0

पूर्णांक कन्वर्जेंस में परिवर्तन के बाद (BIGINT, [टाइमस्टैम्प]) टाइमस्टैम्प के रूप में मुझे इसका परिणाम मिल गया है

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701124 446701125 446701126

हां, यह कोई दिनांक और समय नहीं है, यह सीरियल नंबर है



0

मुझे टाइमस्टैम्प के साथ भी यही समस्या थी: '29 -JUL-20 04.46.42.000000000 PM '। मैं इसे 'yyyy-MM-dd' प्रारूप में बदलना चाहता था। समाधान जो मेरे लिए आखिरकार काम करता है

सेलेक्ट TO_CHAR (mytimestamp, 'YYYY-MM-DD') Mytable से;


0

मैं मान लूंगा कि आपने डिटेल्स स्टेटमेंट के रूप में डेटा डंप किया है, और आप (या जो भी Googles यह है) दिनांक और समय का पता लगाने का प्रयास कर रहा है, या इसे कहीं और उपयोग करने के लिए अनुवाद कर रहा है (जैसे: MySQL आवेषण में कनवर्ट करने के लिए)। यह वास्तव में किसी भी प्रोग्रामिंग भाषा में आसान है।

चलो इस के साथ काम करते हैं:

CAST(0x0000A61300B1F1EB AS DateTime)

यह हेक्स प्रतिनिधित्व वास्तव में दो अलग-अलग डेटा तत्व हैं ... दिनांक और समय। पहले चार बाइट्स तारीख हैं, दूसरे चार बाइट्स समय हैं।

  • तारीख 0x0000A613 है
  • समय 0x00B1F1EB है

अपनी पसंद की प्रोग्रामिंग भाषा का उपयोग करके दोनों खंडों को पूर्णांक में कनवर्ट करें (यह पूर्ण रूपांतरण के लिए एक सीधा हेक्स है, जो कि हर आधुनिक प्रोग्रामिंग भाषा में समर्थित है, इसलिए, मैं उस कोड के साथ स्थान बर्बाद नहीं करूंगा जो प्रोग्रामिंग भाषा हो सकता है या नहीं हो सकता है तुम काम कर रहे हो)।

  • 0x0000A613 की तारीख 42515 हो जाती है
  • 0x00B1F1EB का समय 11661803 हो जाता है

अब, उन पूर्णांकों के साथ क्या करना है:

दिनांक

दिनांक 01/01/1900 से है, और दिनों के रूप में दर्शाया जाता है। तो, 42,515 दिन को 01/01/1900 पर जोड़ें, और आपका परिणाम 05/27/2016 है।

समय

समय थोड़ा अधिक जटिल है। उस INT को ले लो और आधी रात के बाद से माइक्रोसेकंड में अपना समय पाने के लिए निम्नलिखित करें (स्यूडोकोड):

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

वहां से, समय के साथ माइक्रोसेकंड (38872676666.7) से ऊपर उदाहरण में) का अनुवाद करने के लिए अपनी भाषा के पसंदीदा फ़ंक्शन कॉल का उपयोग करें।

परिणाम 10: 47: 52.677 होगा


-1

उनमें से कुछ वास्तव में SQL Server 2008 से दिनांक-समय के लिए गुप्त है बाद ।

निम्न SQL क्वेरी आज़माएं और आप स्वयं देखेंगे:

SELECT CAST (0x00009CEF00A25634 AS datetime)

उपरोक्त परिणाम होगा, 2009-12-30 09:51:03:000लेकिन मैंने उन लोगों का सामना किया है जो वास्तव में किसी तिथि-समय पर मैप नहीं करते हैं।


1
ऐसा मत करो। आप भाग्यशाली हो सकते हैं और एक रूपांतरण प्राप्त कर सकते हैं लेकिन तारीख का समय व्यर्थ और भ्रामक होगा। टाइमस्टैम्प सिर्फ एक अनुक्रम संख्या है और अब इसे पंक्ति संस्करण docs.microsoft.com/en-us/sql/t-sql/data-types/… कहा जाता है । यदि आप दशमलव संख्या सिर्फ BIGINT
जेसन एस


-3

यकीन नहीं होता कि मैं यहाँ कुछ याद कर रहा हूँ, लेकिन क्या आप इस तरह टाइमस्टैम्प को नहीं बदल सकते:

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

क्या आपने यह कोशिश की? TIMESTAMP का DATE से कोई संबंध नहीं है।
शॉन पीयर्स

मैं इसे SQL Server 2008 पर उपयोग कर रहा हूँ
डैनियल

फिर, डेटाइम को कास्ट करने की कोशिश मत करो। यह हेक्साडेसिमल रूप में एक पूर्णांक अनुक्रम है। सिर्फ BIGINT को कास्ट किया।
जेसन एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.