টি-এসকিউএল দিয়ে দিনের মাস এবং বছর থেকে একটি তারিখ তৈরি করুন


264

আমি পৃথক অংশ যেমন 12, 1, 2007 এর সাথে ডেটকে এসকিউএল সার্ভার 2005-এ একটি ডেটটাইমে রূপান্তরিত করার চেষ্টা করছি I আমি নিম্নলিখিতগুলি চেষ্টা করেছি:

CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)

তবে ফল ভুল তারিখে। তিনটি তারিখের মানকে যথাযথ ডেটটাইম ফর্ম্যাটে পরিণত করার সঠিক উপায় কী।


8
অনুগ্রহ করে আপনার গৃহীত উত্তর পরিবর্তন করার ব্যাপারে বিবেচনা weblogs.sqlteam.com/jeffs/archive/2007/09/10/...
ব্রায়ান কারার

তারিখের প্রচার (বছর, মাস, দিন)
কেট

উত্তর:


174

ধরে নিচ্ছি y, m, dসবই intকেমন, কেমন:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

এসকিউএল সার্ভার ২০১২ এবং তারপরের জন্য দয়া করে আমার অন্য উত্তরটি দেখুন


এটা বাজে. আমাকে 1 ই জানুয়ারীর10001 তারিখ থেকে লিখুন
ওলেগ ডক

24
ওলেগ এসকিউএল সার্ভারের তারিখটাইম 1753-01-01 এর পরে আর পিছনে যাবেন না।
কোডমনকি

2
এই উত্তরটি তারিখের ফর্ম্যাট সেটিংসের উপর নির্ভর করে, যা আপনি উল্লেখ না করলে আপনার সার্ভারের আঞ্চলিক সেটিংসের উপর নির্ভরশীল। yyyymmddবিন্যাস যারা সেটিংস নির্বিশেষে কাজ করে। "ছয় বা আট-অঙ্কের স্ট্রিংটি সর্বদা ymd হিসাবে ব্যাখ্যা করা হয় ।" docs.microsoft.com/en-us/sql/t-sql/data-types/... : এই উত্তর দেখার stackoverflow.com/a/46064419/2266979
রিলে মেজর

339

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

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1, 
          DateAdd(month, @Month - 1, 
              DateAdd(Year, @Year-1900, 0)))

এটি পাশাপাশি কাজ করে, কোনও স্ট্রিং রূপান্তর না করার সুবিধা যুক্ত করেছে, সুতরাং এটি খাঁটি পাটিগণিত প্রক্রিয়াকরণ (খুব দ্রুত) এবং এটি কোনও তারিখের ফর্ম্যাটের উপর নির্ভর করে না এটি এই তথ্যের উপর নির্ভর করে যে ডেটটাইম এবং স্মার্ট ডেটটাইম মানগুলির জন্য এসকিউএল সার্ভারের অভ্যন্তরীণ উপস্থাপনা দুটি অংশের মানটির প্রথম অংশটি হ'ল 1 জানুয়ারি 1900 সাল থেকে দিনের সংখ্যার প্রতিনিধিত্ব করে পূর্ণসংখ্যা এবং দ্বিতীয় অংশটি দশমিক ভগ্নাংশ যা এক দিনের (সময়ের জন্য) ভগ্নাংশের অংশকে উপস্থাপন করে --- সুতরাং পূর্ণসংখ্যার মান 0 (শূন্য) ) সর্বদা 1 জানুয়ারী 1900 এর মধ্যরাতের সকালে সরাসরি অনুবাদ করে ...

বা, @ ব্রিনার থেকে পরামর্শের জন্য ধন্যবাদ,

Select DateAdd(yy, @Year-1900,  
       DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 

সম্পাদিত অক্টোবর 2014. হিসাবে @cade Roux, এসকিউএল 2012 এখন একটি বিল্ট-ইন ফাংশন আছে দ্বারা উল্লেখযোগ্য:
DATEFROMPARTS(year, month, day)
যে একই জিনিস আছে।

3 অক্টোবর 2016 সম্পাদিত, (এটি লক্ষ্য করার জন্য @ বামবামসকে ধন্যবাদ, এবং এটি ঠিক করার জন্য @ ব্রাইনারি), @ ব্রিনার দ্বারা প্রস্তাবিত শেষ সমাধান বছর সংযোজন প্রথম সম্পাদন না করা হলে লিপ বছর ধরে কাজ করে না বলে মনে হয়

select dateadd(month, @Month - 1, 
     dateadd(year, @Year-1900, @DayOfMonth - 1)); 

36
@ ব্র্যান্ডন, পরিবর্তে আপনার এই উত্তর হিসাবে চিহ্নিত করা উচিত। এটি সেরা। অন্যান্য স্ট্যাকওভারফ্লো পাঠকদের পরিষেবা হিসাবে এটি করুন।
বিল পাইটজেকে

3
লিপ বছর ধরে কাজ করে: ডেটেডড নির্বাচন করুন (মিমি, (@ y-1900) * 12 + @ মি - 1,0) + (@ ডি -1)
লুকানো

8
একটি বৈধ এখনো কৃত্রিম তারিখ মান ফলাফল যখন মান যেমন অবৈধ সমন্বয় পাস @Year = 2001, @Month = 13এবং @DayOfMonth = 32ফলাফল 2002-02-01T00:00:00.000। গৃহীত উত্তর (ক্যাড রক্স দ্বারা) একটি ত্রুটি উত্পন্ন করে, যা আরও কার্যকর।
onedaywhen

6
আপনাকে শূন্য দিয়ে আর দিন যোগ করতে হবে না। আপনি @ DayOfMonth-1 দিয়ে সরাসরি শুরু করতে পারেন, তারপরে মাস এবং বছর যোগ করুন। এটি আর একটি তারিখ অ্যাড ()!
ব্রায়ানারি

2
আমার মাথা এখনও ঘুরছে - সত্যিই এটি করার খুব সুন্দর উপায় নেই? (এসকিউএল সার্ভার 2005-এ আমার কোনও প্রশ্নের সমাধান করার দায়িত্ব দেওয়া হয়েছে)
পিটার পেরে

241

এসকিউএল সার্ভার ২০১২-এর একটি দুর্দান্ত এবং দীর্ঘ-প্রতীক্ষিত নতুন DATEFROMPARTS ফাংশন রয়েছে (যা তারিখটি অবৈধ হলে একটি ত্রুটি বাড়িয়ে তুলবে - এই সমস্যার কোনও DATEADD- ভিত্তিক সমাধানের ক্ষেত্রে আমার মূল আপত্তি):

http://msdn.microsoft.com/en-us/library/hh213228.aspx

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

অথবা

DATEFROMPARTS(@y, @m, @d)

11
অধিকন্তু, মূল প্রশ্ন, যেখানে DATETIME বস্তুর উল্লেখ করা হয়েছিল উল্লেখ করা রয়েছে একটি ফাংশন বলা DATETIMEFROMPARTS হল: msdn.microsoft.com/pl-pl/library/hh213233%28v=sql.110%29.aspx
Maciej Jaśniaczyk

116

বা কেবল একটি একক তারিখ যুক্ত ফাংশন ব্যবহার করে:

DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011

SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)

4
সেরা উত্তর আইএমও। চার্লসের উত্তরের সমস্ত সুবিধা রয়েছে এবং এটি আরও খাটো।
মাইকেল

1
এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার এবং সহজ। এবং দিনের মানগুলি যখন সীমার বাইরে থাকে তখন এটি কোনও ত্রুটি ছুঁড়ে না। তবে পরিস্থিতিটির উপর নির্ভর করে একটি ত্রুটি পছন্দ হতে পারে, তাই সচেতন থাকুন যে এটি দিনের এবং মাসের মানগুলিকে প্রত্যাশিত সীমা ছাড়িয়ে যায় sile
শন কোভাক

16

এসকিএল সার্ভার ২০১২-এ একটি ফাংশন রয়েছে যা অংশগুলির ( ডিটেফ্রোম্পার্টস ) উপর ভিত্তি করে তারিখ তৈরি করবে । আমাদের বাকিদের জন্য, এখানে আমি তৈরি করেছি একটি ডিবি ফাংশন যা অংশগুলি থেকে তারিখ নির্ধারণ করবে (ধন্যবাদ @ চারেলস) ...

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[func_DateFromParts]'))
    DROP FUNCTION [dbo].[func_DateFromParts]
GO

CREATE FUNCTION [dbo].[func_DateFromParts]
(
    @Year INT,
    @Month INT,
    @DayOfMonth INT,
    @Hour INT = 0,  -- based on 24 hour clock (add 12 for PM :)
    @Min INT = 0,
    @Sec INT = 0
)
RETURNS DATETIME
AS
BEGIN

    RETURN DATEADD(second, @Sec, 
            DATEADD(minute, @Min, 
            DATEADD(hour, @Hour,
            DATEADD(day, @DayOfMonth - 1, 
            DATEADD(month, @Month - 1, 
            DATEADD(Year, @Year-1900, 0))))))

END

GO

আপনি এটিকে এভাবে কল করতে পারেন ...

SELECT dbo.func_DateFromParts(2013, 10, 4, 15, 50, DEFAULT)

রিটার্নস ...

2013-10-04 15:50:00.000

12

CAST এর পরিবর্তে CONVERT ব্যবহার করে দেখুন।

CONVERT তারিখের ফর্ম্যাটটি নির্দেশ করে একটি তৃতীয় প্যারামিটারের অনুমতি দেয়।

ফর্ম্যাটগুলির তালিকা এখানে রয়েছে: http://msdn.microsoft.com/en-us/library/ms187928.aspx

"সঠিক" উত্তর হিসাবে অন্য উত্তর নির্বাচন করার পরে আপডেট করুন:

কোনও উত্তর কেন নির্বাচন করা হয়েছে তা সত্যই বুঝতে পারছি না যে এই সীমাবদ্ধতার ইঙ্গিত ছাড়াই আপনার সার্ভারের NLS সেটিংসের উপর স্পষ্টভাবে নির্ভর করে।


রাজি বিন্যাস চাহিদা যোগ্যতাসম্পন্ন হতে, যেমন রূপান্তর করুন (datetime2, কাস্ট (আঃ varchar @year) + কাস্ট করুন (@month varchar আঃ) + কাস্ট করুন (varchar আঃ @day), 102 '।' '।')
টনি ওয়াল

9

আপনি ব্যবহার করতে পারেন

select DATEFROMPARTS(year, month, day) as ColDate, Col2, Col3 
From MyTable Where DATEFROMPARTS(year, month, day) Between @DateIni and @DateEnd

ভার্জ এমপিএল এবং অ্যাজুরিএসকিউএল থেকে এসকিউএলে কাজ করে


6

'19000101' একটি সুস্পষ্ট সূচনা পয়েন্ট ব্যবহার করা আরও নিরাপদ এবং পরিষ্কার

create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int)
returns datetime2
as
begin
    -- Note! SQL Server 2012 includes datetime2fromparts() function
    declare @output datetime2 = '19000101'
    set @output = dateadd(year      , @Year - 1900  , @output)
    set @output = dateadd(month     , @Month - 1    , @output)
    set @output = dateadd(day       , @Day - 1      , @output)
    set @output = dateadd(hour      , @Hour         , @output)
    set @output = dateadd(minute    , @Minute       , @output)
    set @output = dateadd(second    , @Second       , @output)
    set @output = dateadd(ns        , @Nanosecond   , @output)
    return @output
end

কেন শুধু ব্যবহার করবেন না declare @output datetime2 = 0এবং পরিবর্তে @Year - 1900ব্যবহার @Year - DATEPART(year,0);? এটি এসকিউএল সার্ভার ২০০৮ এ আরও অনেক কিছুই স্পষ্ট করে ছাড়াই কাজ করে।
tsionyx

কারণ এটি কাজ করবে না। আপনি 0 থেকে ডেটটাইম 2 তে কাস্ট করতে পারবেন না। আপনার কোডটি "অপেরাড টাইপের সংঘর্ষ ফিরিয়ে দেবে: ডেটটাইম 2 এর সাথে সামঞ্জস্যহীন নয়"
জ্যাক

4

আপনি যদি স্ট্রিংগুলি বাইরে রাখতে চান না, এটি কাজ করে (এটি একটি ফাংশনে রাখুন):

DECLARE @Day int, @Month int, @Year int
SELECT @Day = 1, @Month = 2, @Year = 2008

SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))

4

যদি আপনার তারিখ এবং সময় উভয় অংশের থেকে ডেটটাইম প্রয়োজন হয় তবে আমি একটি লাইন সমাধান যোগ করি :

select dateadd(month, (@Year -1900)*12 + @Month -1, @DayOfMonth -1) + dateadd(ss, @Hour*3600 + @Minute*60 + @Second, 0) + dateadd(ms, @Millisecond, 0)


2

12 এর নীচে এসকিউএল সার্ভার সংস্করণগুলির জন্য আমি এর CASTসাথে সংমিশ্রণে ব্যবহারের পরামর্শ দিতে পারিSET DATEFORMAT

-- 26 February 2015
SET DATEFORMAT dmy
SELECT CAST('26-2-2015' AS DATE)

SET DATEFORMAT ymd
SELECT CAST('2015-2-26' AS DATE)

আপনি কীভাবে এই স্ট্রিং তৈরি করবেন তা আপনার উপর নির্ভর করে


1

এই কোয়েরিটি চেষ্টা করে দেখুন:

    SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS
    YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS
MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1

ফলাফল:

2014    Ja    1
2015    Ja    1
2014    Ja    1
2015    Ja    1
2012    Ja    1
2010    Ja    1
2015    Ja    1

1

আমি জানি ওপি এসকিউএল 2005 এর উত্তর চাইছে তবে প্রশ্নটি বেশ পুরানো তাই আপনি যদি এসকিউএল 2012 বা তারও বেশি চালাচ্ছেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

SELECT DATEADD(DAY, 1, EOMONTH(@somedate, -1))

তথ্যসূত্র: https://docs.microsoft.com/en-us/sql/t-sql/function/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server- পূর্ববর্তী রূপগুলি


0

আমি ব্যক্তিগতভাবে সাবস্ট্রিংকে পছন্দ করি কারণ এটি পরিষ্কারের বিকল্পগুলি এবং স্ট্রিংটি প্রয়োজন অনুযায়ী বিভক্ত করার ক্ষমতা সরবরাহ করে। অনুমানটি হ'ল ডেটা 'ডিডি, মিমি, ইয়াই' বিন্যাসের।

--2012 and above
SELECT CONCAT (
        RIGHT(REPLACE(@date, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1)),2)
        )

--2008 and below
SELECT   RIGHT(REPLACE(@date, ' ', ''), 4)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5),2)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1),2)

এখানে তথ্য রয়েছে যে কোনও কলামে ডেটা সংরক্ষণ করা হলে কীভাবে মামলা করা যায় of বলা বাহুল্য, কলামে প্রয়োগ করার আগে ফলাফল-সেটটি পরীক্ষা করা এর আদর্শ

DECLARE @Table TABLE (ID INT IDENTITY(1000,1), DateString VARCHAR(50), DateColumn DATE)

INSERT INTO @Table
SELECT'12, 1, 2007',NULL
UNION
SELECT'15,3, 2007',NULL
UNION
SELECT'18, 11 , 2007',NULL
UNION
SELECT'22 , 11, 2007',NULL
UNION
SELECT'30, 12, 2007  ',NULL

UPDATE @Table
SET DateColumn = CONCAT (
        RIGHT(REPLACE(DateString, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), CHARINDEX(',', REPLACE(DateString, ' ', '')) + 1, LEN(REPLACE(DateString, ' ', '')) - CHARINDEX(',', REPLACE(DateString, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), 1, CHARINDEX(',', REPLACE(DateString, ' ', '')) - 1)),2)
        ) 

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