किसी अन्य फ़ील्ड से समय के साथ दिनांक को कैसे संयोजित करें - MS SQL सर्वर


198

जिस एक्स्ट्रेक्ट में मैं काम कर रहा हूं, उसमें मेरे 2 datetimeकॉलम हैं। एक कॉलम तारीखों को संग्रहीत करता है और दूसरे को दिखाया गया समय।

मैं इन दोनों फ़ील्ड को 1 कॉलम प्रकार में संयोजित करने के लिए तालिका की क्वेरी कैसे कर सकता हूं datetime?

खजूर

2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000

टाइम्स

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000

जवाबों:


252

आप बस दोनों को जोड़ सकते हैं।

  • अगरTime part के अपनेDate स्तंभ हमेशा शून्य है
  • औरDate part अपने के Timeस्तंभ भी हमेशा शून्य है (आधार तिथि: 1 जनवरी, 1900)

उन्हें जोड़ने से सही परिणाम मिलता है।

SELECT Combined = MyDate + MyTime FROM MyTable

राशनले (कुडोस से ErikE / dnolan)

दिनांक Integers4-बाइट्स के साथ दिनांक 4-बाइट के रूप में संग्रहीत होने के कारण dateऔर दाईं ओर 4-बाइट्स होने के कारण यह इस तरह से काम करता है time। यह करना पसंद है$0001 0000 + $0000 0001 = $0001 0001

नए SQL Server 2008 प्रकारों के बारे में संपादित करें

Dateऔर Timeप्रकार में पेश कर रहे हैं SQL Server 2008। यदि आप जोड़ने पर जोर देते हैं, तो आप उपयोग कर सकते हैंCombined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Edit2 SQL सर्वर 2008 और ऊपर (मार्टिन स्मिथ के लिए यश) में परिशुद्धता के नुकसान के बारे में

SQL सर्वर में डेटाइम 2 में दिनांक और समय को कैसे संयोजित करें पर एक नज़र है ? SQL Server 2008 और ऊपर का उपयोग करके परिशुद्धता के नुकसान को रोकने के लिए।


2
@ जों, यह सत्य है जब तक कि तिथि स्तंभ का समय तत्व और समय स्तंभ का दिनांक तत्व दोनों शून्य हैं।
ल्यूक

1
आप सबसे अधिक संभावना का सामना कर रहे यहाँ क्या desribed है groups.google.be/group/... Borland * + लेखक% 3 ए TeamB * # 1ab62659d8be3135
Lieven Keersmaekers

2
SQL सर्वर में "शून्य" तिथि है 1900-01-01, नहीं?
एंड्री एम १६'१३

1
जब मैंने यह कोशिश की तो मुझे 'टाइम' वैल्यू को डेटाइम करने की आवश्यकता नहीं थी। दूसरे शब्दों में आप कर सकते हैं: डेटाइम + टाइम
सैम

1
SQL सर्वर में @dnolan दिनांक को संग्रहीत नहीं किया जाता है float। पृथ्वी पर आपने यह कहां सीखा? उन्हें पूर्णांक के रूप में संग्रहीत किया जाता है : तारीख का हिस्सा एक लंगर की तारीख के बाद के दिनों की संख्या है, और समय का हिस्सा आधी रात के बाद से "टिक" की संख्या है, टिक को 1/300 के लिए datetimeऔर अधिक सटीक के रूप में परिभाषित किया जा रहा है timeऔर datetime2
एरिक

129

अपनी तिथि स्तंभ के समय तत्व हैं और अपना समय स्तंभ की तारीख तत्व दोनों शून्य हैं तो Lieven का जवाब आप क्या जरूरत है। यदि आप गारंटी नहीं दे सकते कि हमेशा मामला रहेगा तो यह थोड़ा और जटिल हो जाता है:

SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table

उत्तर ल्यूक के लिए धन्यवाद। सौभाग्य से, इस मामले में मैं गारंटी दे सकता हूं कि अन्य आइटम हमेशा शून्य हैं, मुझे लगता है कि 2 फ़ील्ड 3 पक्ष कोड पर भी 1 हो सकते हैं जो हमारे लिए एक्सट्रैक्ट करता है।
जॉन विंस्टनले

6
मैं ओपी के रूप में एक ही समस्या थी सिवाय मुझे पता है कि अनावश्यक भागों कभी शून्य नहीं हैं। इसलिए यह बेहद उपयोगी है, अगर मैं आपको दो बार वोट दे सकता हूं!

इसने मुझे बचा लिया! मैं दोनों को चार्ट में परिवर्तित कर रहा था और फिर संक्षिप्त कर रहा था और फिर DATETIME पर वापस आ रहा था, लेकिन तब मैं इसे अनुक्रमणित नहीं कर सका, क्योंकि SQL ने कहा कि यह गैर-नियतात्मक था। यह स्पष्ट रूप से नियतात्मक है !!! धन्यवाद !!! आप !!!
ईडाईलोन

4
आपका SQL Server 2008 संस्करण काम नहीं करता है। The data types datetime and time are incompatible in the add operator.
मार्टिन स्मिथ

@ मार्टिन: मैंने टूटी हुई SQL2008 संस्करण को हटा दिया है।
ल्यूक

26

यह बिना किसी चर रूपांतरण के एक वैकल्पिक समाधान है:

DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))

आप इस तरह केवल मिलीसेकंड सटीकता प्राप्त करेंगे, लेकिन यह सामान्य रूप से ठीक होगा। मैंने इसे SQL Server 2008 में परीक्षण किया है।


14

इसने मेरे लिए काम किया

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(SQL 2008 R2 पर)


1
SQL Server 2008 में शानदार काम किया।
Tobias

7
मुझे डेटा प्रकार डेटाटाइम मिलता है और समय ऐड ऑपरेटर में असंगत है। SQL सर्वर 2012 पर त्रुटि
डेविन प्रीजेन

4
SQL 2012 डेटा प्रकार
डेटाटाइम

3
यह अब SQL सर्वर 2012 और उससे अधिक (परिवर्तन को तोड़ने) में काम नहीं करता है। विवरण के लिए यहां देखें: social.msdn.microsoft.com/forums/azure/en-US/…
Heinzi

10

यदि आप SQL Server 2008 का उपयोग नहीं कर रहे हैं (यानी आपके पास केवल एक डेटटाइम डेटा प्रकार है), तो आप जो चाहते हैं उसे प्राप्त करने के लिए निम्नलिखित (सम्मिलित रूप से मोटे और तैयार) TSQL का उपयोग कर सकते हैं:

DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime 

SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'


-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))

-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)

-- Concatenates Date and Time parts.
SELECT
CAST(
    DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
    DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)           
as datetime)

यह मोटा और तैयार है, लेकिन यह काम करता है!


9
  1. यदि आपके दोनों क्षेत्र डेटाइम हैं, तो बस उन्हें जोड़ने से काम चल जाएगा।

    उदाहरण के लिए:

    Declare @d datetime, @t datetime
    set @d = '2009-03-12 00:00:00.000';
    set @t = '1899-12-30 12:30:00.000';
    select @d + @t
  2. यदि आपने दिनांक और समय डेटाटाइप का उपयोग किया है, तो बस समय को डेटाइम में डालें

    उदाहरण के लिए:

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)

3

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

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 

3
स्ट्रिंग में परिवर्तित करना डेटीड की तुलना में धीमा है। stackoverflow.com/questions/2775/…
ErikE

2

मुझे ऊपर बताई गई कई त्रुटियाँ थीं इसलिए मैंने इसे इस तरह किया

try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime

इसने मेरे लिए काम किया।


2

दोनों फ़ील्ड को DATETIME में परिवर्तित करें:

SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)

और अगर आप Getdate()पहले इसका उपयोग कर रहे हैं :

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)

1
DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);

INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');

INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');

WITH Dates (ID, [Date])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
    JOIN Times ON Times.ID = Dates.ID

प्रिंटों:

2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30:00.000


0

सेस्ट (CAST (@DateField as Date) तारीख के रूप में) + CAST (CAST (@TimeField As Time) As DateTime)


0

दूसरा तरीका यह है कि आप इसका उपयोग करें CONCATऔर CASTजागरूक रहें, ताकि आपको DATETIME2(x)इसे काम करने के लिए उपयोग करने की आवश्यकता हो । आप बिना किसी सटीक नुकसान के xबीच कुछ भी सेट कर सकते हैं 0-7 7

DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))

रिटर्न 2018-03-12 07:00:00.0000000

SQL सर्वर 14 पर परीक्षण किया गया


-1

डेटाइम कालम से तिथि और दूसरे डेटाइम कॉलम से समय को जोड़ना यह आपके लिए सबसे अच्छा समाधान है:

select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable

परिणाम में त्रुटि "डेटा प्रकार डेटाटाइम और समय एड ऑपरेटर में असंगत हैं।"
Oskar Berggren

-1

मैं उसी तरह की स्थिति में भाग गया, जहाँ मुझे DateTime को दिनांक और समय फ़ील्ड को मर्ज करना पड़ा। उपर्युक्त समाधान कार्यों में से कोई भी, विशेष रूप से दो क्षेत्रों को जोड़ना क्योंकि इन 2 क्षेत्रों के अलावा के लिए डेटा प्रकार समान नहीं है।

मैंने नीचे समाधान बनाया, जहां मैंने घंटे और फिर मिनट भाग को तारीख में जोड़ा। इसने मेरे लिए खूबसूरती से काम किया। कृपया इसे देखें और मुझे बताएं कि क्या आप किसी मुद्दे पर आते हैं।

; tbl as (Select StatusTime = '12 / 30/1899 5:17:00 PM 'का चयन करें, StatusDate =' 7/24/2019 12:00:00 AM ') DATEADD (MI, DATEPART (MINUTE, CAST) (tbl) का चयन करें .StatusTime AS TIME)), DATEADD (HH, DATEPART (HOUR, CAST (tbl.StatusTime AS TIME))), CAST (tbl.StatusDate as DETETIME)) tbl से)

परिणाम: 2019-07-24 17: 17: 00.000

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