डेटाइम स्ट्रिंग में 1 मिलीसेकंड कैसे जोड़ें?


15

एक चयन के आधार पर, मैं x पंक्तियों को इस तरह वापस कर सकता हूं:

1   2019-07-23 10:14:04.000
1   2019-07-23 10:14:11.000
2   2019-07-23 10:45:32.000
1   2019-07-23 10:45:33.000

हमारे पास 0 के साथ सभी मिलीसेकंड हैं।

क्या 1 मिली 1 सेकंड जोड़ने का कोई तरीका है, इसलिए चयन इस तरह होगा:

1   2019-07-23 10:14:04.001
1   2019-07-23 10:14:11.002
2   2019-07-23 10:45:32.003
1   2019-07-23 10:45:33.004

मैं कोई सफलता नहीं के साथ एक कर्सर या एक अद्यतन बनाने की कोशिश कर रहा हूँ।

यह मेरे इच्छित परिणाम प्राप्त करने की क्वेरी है:

  select top 10 ModifiedOn 
    from [SCHEMA].[dbo].[TABLE]
  where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'

81k मान हैं। मैदान है DATETIME


2
क्या आप 1 मिलीसेकंड को पंक्ति 1, 2 मिलीसेकंड को पंक्ति 2, 3 मिलीसेकंड को पंक्ति 3, आदि में जोड़ने का प्रयास कर रहे हैं?
जॉन एइसब्रेनर

जवाबों:


33

Datetime1 मिलीसेकंड के स्तर के लिए सटीक नहीं है। जब तक आप पूछ नहीं रहे हैं तब तक संभव नहीं है जब तक आप एक अलग डेटाटाइप (यानी datetime2) में नहीं बदलते ।

प्रलेखन

महत्वपूर्ण उद्धरण:

.000, .003, या .007 सेकंड की वृद्धि के लिए सटीकता गोल


13

DateAddसमारोह के लिए आप क्या देख रहे है।

millisecondफ़ंक्शन के पहले पैरामीटर के रूप में उपयोग करें , यह बताने के लिए कि आप मिलीसेकंड जोड़ रहे हैं। फिर 1मिलिसेकंड की संख्या जोड़ने के लिए दूसरे पैरामीटर के रूप में उपयोग करें ।

यहां एक उदाहरण है, एक चर में वर्तमान समय को हथियाने, और फिर इसमें एक मिलीसेकंड जोड़कर परिणाम को दूसरे चर के रूप में सहेजा जाता है, और फिर प्रत्येक चर को प्रिंट किया जाता है।

Declare @RightNow as DateTime2
Declare @RightNowPlusAMillisecond as DateTime2

Select @RightNow = Getdate()
Select @RightNowPlusAMillisecond = DateAdd(millisecond,1,@RightNow)

Print @RightNow
Print @RightNowPlusAMillisecond

परिणाम:

2019-07-23 08:25:38.3500000
2019-07-23 08:25:38.3510000

ध्यान दें:

जैसा कि फॉरेस्ट एक अन्य उत्तर में बताते हैं, datetimeडेटा प्रकार मिलीसेकंड परिशुद्धता की गारंटी नहीं देता है। यह .000, .003, या .007 सेकंड की वृद्धि के लिए गोल है। यदि आप मिलीसेकंड सटीक चाहते हैं, तो उपयोग करें datetime2


13

@ डग-डेडेन के पास सही शुरुआती बिंदु है, लेकिन मैं सिर्फ यह जवाब देने की कोशिश करना चाहता था कि मैंने जो सोचा था वह सवाल का मूल उद्देश्य था - इसे प्रति पंक्ति बढ़ती मिलीसेकंड के साथ परिणाम पर कैसे लागू किया जाए।

उस स्थिति में, आप ROW_NUMBER और एक कॉमन टेबल एक्सप्रेशन का उपयोग कर सकते हैं (आपको टेबल संरचना के लिए आवश्यकतानुसार संपादित करें, जिसमें शामिल हैं, आदि)।

मान दिखाने के लिए चयन करें:

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
SELECT TOP 1000 *, DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2)) [new_date]
FROM CTE
ORDER BY my_date_column

अपडेट मूल तालिका में वापस मिलती है:

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
UPDATE t SET 
my_date_column = DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2))
FROM CTE c
     JOIN Table1 t ON c.my_id = t.my_id

यह CTE updatable है। वापस शामिल होने की जरूरत नहीं है Table1। बस करते हैंUPDATE CTE SET my_date_column =...
स्टीवन हिबल जूल

4

मैंने इसका उपयोग किया है DATETIME2(3)

जैसा कि आप नीचे क्वेरी पर देख सकते हैं, यह अधिक है economic:

declare @dt1 datetime2(3)
declare @dt2 datetime2

SELECT @DT1 = SYSDATETIME()
SELECT @DT2=  SYSDATETIME()

SELECT [THE LENGTH OF DATETIME2]=DATALENGTH(@DT2)
      ,[THE LENGTH OF DATETIME2(3)]=DATALENGTH(@DT1)

यहाँ छवि विवरण दर्ज करें

के बीच अंतर datetimeऔर datetime2अच्छी तरह से यहाँ समझाया गया है

इस अभ्यास के लिए मैं परीक्षण के प्रयोजनों के लिए एक अस्थायी तालिका बनाता हूं, और आज और आज random datesसे अलग 999 के साथ इसे आबाद करता हूं 01-jan-2019( 23-july-2019)

और फिर क्रम में, मैं 1 से 999 तक मिलीसेकंड सेट करता हूं

SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOEXEC OFF

IF OBJECT_ID ('TEMPDB..#T1') IS NOT NULL
   DROP TABLE #T1

CREATE TABLE #t1(the_date DATETIME2(3) NOT NULL PRIMARY KEY CLUSTERED )
GO

-- run this 999 times - hopefully there will be no duplicates
-- SELECT 204*24*60*60 - today is 23-july-2019 - the 203rd day of the year
    DECLARE @DT DATETIME2(3)
    SELECT @DT = CONVERT(DATETIME2(3),
           DATEADD(SECOND, ABS(CHECKSUM(NEWID()) % 17625600), 
                   '2019-01-01'),120) 

    --SELECT @DT

    IF NOT EXISTS( SELECT 1 FROM #T1 WHERE THE_DATE = @DT) 
    INSERT INTO #T1 VALUES (@DT)
GO 999


--check it out what we have
SELECT * FROM #T1

--get the date and the new date
SELECT 
 THE_DATE
,THE_NEW_DATE= DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY THE_DATE), THE_DATE ) 
 FROM #T1

और यह मुझे मिलता है: (आंशिक दृश्य)

यहाँ छवि विवरण दर्ज करें


2

अन्य पोस्टरों में से एक सही है; DATETIME(T-SQL में) मिलीसेकंड के लिए सही नहीं है (यह सेंटीसेकंड के लिए सटीक है)।

सटीकता के उस स्तर के लिए, आप उपयोग करना चाहते हैं DATETIME2

यहाँ एक स्ट्रिंग datetimeको परिवर्तित करने का एक उदाहरण दिया गया है datetime2, फिर 1 मिलीसेकंड, और अंत में, एक स्ट्रिंग में वापस परिवर्तित करना।

select convert(
            varchar(MAX), --in T-SQL, varchar length is optional
            dateadd(
                millisecond,
                1,
                convert(
                    datetime2,
                    '2019-07-23 12:01:23.11'
                )
            )
        )

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