ডেটটাইম স্ট্রিংয়ে কীভাবে 1 মিলিসেকেন্ড যুক্ত করবেন?


15

একটি নির্বাচনের উপর ভিত্তি করে, আমি এই জাতীয় এক্স সারি ফিরে আসতে পারেন:

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

এই সিটিই আপডেটেড। ফিরে যোগদানের দরকার নেই 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ভাল ব্যাখ্যা করা হয়েছে এখানে

এই ব্যায়াম আমি উদ্দেশ্যে পরীক্ষার জন্য একটি টেম্প টেবিল তৈরি, এবং 999 বিভিন্ন করে এটিকে পূরণ random datesথেকে 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(টি-এসকিউএল এ) মিলিসেকেন্ডের সাথে সঠিক নয় (এটি সেন্টিসেকেন্ডের সাথে সঠিক)।

নির্ভুলতার সেই স্তরের জন্য, আপনি ব্যবহার করতে চান 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'
                )
            )
        )

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