SQL Server 2005/2008 में सप्ताह का दिन प्राप्त करें


369

अगर मेरे पास 01/01/2009 की तारीख है, तो मैं यह जानना चाहता हूं कि यह सोमवार, मंगलवार, आदि किस दिन था ...

SQL Server 2005/2008 में इसके लिए कोई अंतर्निहित कार्य है? या क्या मुझे एक सहायक तालिका का उपयोग करने की आवश्यकता है?


1
यदि आपके पास दिनांक भागों के लुकअप वाली तालिका है, तो आपने आम तौर पर कुछ गलत किया है। SQL सर्वर की तिथि फ़ंक्शन कई और मज़बूत होते हैं, इसलिए किसी भी डेटा को आपको जिस दिनांक से निकालने की आवश्यकता होती है, वह आसानी से एक डेटाइम कॉलम पर किया जा सकता है।
बेंजामिन ऑटिन

6
सहायक टेबल तिथि गणना के लिए बहुत उपयोगी हैं, एक कैलेंडर सहायक तालिका होना असामान्य नहीं है ...

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

5
मैं अपने शब्दों को खाऊंगा यदि आप मुझे कैलेंडर टेबलों के लिए उपयोग दिखा सकते हैं कि 1) जटिल छुट्टी / कार्यदिवस के नियमों के लिए नहीं है, 2) आसानी से बिल्ट-इन फ़ंक्शन के साथ नहीं किया जा सकता है, और 3) केवल # नहीं 2, उसके बाद एक नंबर टेबल भी काम करती है और विशिष्ट तिथियों के साथ तालिका को आबाद करने की आवश्यकता नहीं होती है।
एरिक

2
डेटा वेयरहाउस कैलेंडर टेबलों का व्यापक उपयोग करते हैं। प्रारंभिक महीनों, तिमाहियों, वर्षों, आदि अंतिम उपयोगकर्ताओं को उन क्षेत्रों के साथ प्रदान करते हैं जिनके खिलाफ वे फ़िल्टर / एकत्र कर सकते हैं।
डेविड रशटन

जवाबों:


694

उपयोग DATENAMEया DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

thx, मैंने डेटानेम की कोशिश की थी, लेकिन डी का उपयोग किया, मुझे एक पूर्णांक वापस दिया। dw उम्मीद के मुताबिक काम करता है

39
इसलिए मैं चुनिंदा डेटानेम (कार्यदिवस, गेटडेट ()) का उपयोग करना पसंद करता हूं। मुझे यह याद रखने की ज़रूरत नहीं है कि कार्यदिवस के दिन वापसी होती है .... जब मैं इसके बजाय "कार्यदिवस" ​​का उपयोग कर सकता हूं।
जॉर्ज मैस्ट्रोस

9
इस पर कोई भी नज़र रखता है - ध्यान दें कि सप्ताह की डिफ़ॉल्ट शुरुआत रविवार है । @ सूंग के जवाब को देखें कि कैसे सुरक्षित रूप से बदलना है
जॉनी रा

2
@niico यह है क्योंकि SQL 1 से अनुक्रमित है, जबकि C 0. से भाषाओं की तरह सूचकांक
user824276

95

भले ही SQLMenace का उत्तर स्वीकार कर लिया गया हो, लेकिन एक महत्वपूर्ण SETविकल्प है जिससे आपको अवगत होना चाहिए

DATEFIRST सेट करें

DATENAME सही तिथि नाम लौटाएगा लेकिन उसी DATEPART मान का नहीं यदि सप्ताह के पहले दिन को नीचे सचित्र रूप में बदल दिया गया हो।

declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select  [@DefaultDateFirst] = @DefaultDateFirst 

set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7

--; Set the first day of week to * TUESDAY * 
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst

33
तो निरंतर तारीख मूल्य प्राप्त करने के लिए, आप करते हैं ( @@datefirst - 1 + datepart(weekday, thedate) ) % 7। रविवार हमेशा शून्य रहेगा।
एंडी तजहोनो

1
किफ़ॉफ़ भयानक यह सामान स्थिर है, इसलिए आपको क्वेरी मूल, परिवर्तन मान, रन क्वेरी, रीसेट मूल पैटर्न का पालन करना होगा
जोनीरा

2
इस बात का अजीब हिस्सा नेट की कि है DayOfWeekगणन है DayOfWeek.Sundayके एक मूल्य के साथ ... 0। तो, चाहे जो DateFirstभी हो, एक अनुपचारित SQL- लौटाया गया WEEKDAYमान कभी भी .NET समकक्ष के अनुकूल नहीं होगा। Yay, Microsoft।
एरिक वू

26
SELECT  CASE DATEPART(WEEKDAY,GETDATE())  
    WHEN 1 THEN 'SUNDAY' 
    WHEN 2 THEN 'MONDAY' 
    WHEN 3 THEN 'TUESDAY' 
    WHEN 4 THEN 'WEDNESDAY' 
    WHEN 5 THEN 'THURSDAY' 
    WHEN 6 THEN 'FRIDAY' 
    WHEN 7 THEN 'SATURDAY' 
END

26
आपको पता होना चाहिए कि उसी को प्राप्त करने के लिए चिकित्सा एक अंतर्निहित कार्य है। select datename(dw,getdate())
सोहम दासगुप्ता

10
@SohamDasgupta इस फ़ंक्शन में बनाया गया MS SQL के गैर-अंग्रेज़ी संस्करण के लिए समान परिणाम नहीं देता है।
बजे मिस्टर स्केपग्रेस

12

किसी दिए गए दिनांक के लिए सप्ताह के दिन के लिए एक निर्धारक मूल्य प्राप्त करने के लिए आप DATEPART () और @@ डेटफ़र्स्ट के संयोजन का उपयोग कर सकते हैं । अन्यथा आपका सर्वर पर सेटिंग्स पर निर्भर है।

बेहतर समाधान के लिए निम्न साइट देखें: MS SQL: सप्ताह का दिन

सप्ताह का दिन फिर 0 से 6 की सीमा में होगा, जहां 0 रविवार, 1 सोमवार है, आदि। फिर आप सप्ताह के सही नाम को वापस करने के लिए एक साधारण केस स्टेटमेंट का उपयोग कर सकते हैं।


5
कृपया उत्तर को उत्तर में रखें ताकि लोगों को इसे पाने के लिए लिंक पर क्लिक न करना पड़े।
मार्टिन स्मिथ

11

यूरोप:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);

2
कृपया यह बताएं कि आपका कोड क्या करता है और यह प्रश्न का उत्तर कैसे देता है। यदि आपको उत्तर के रूप में एक कोड स्निपेट मिलता है, तो आप यह नहीं जान सकते हैं कि इसके साथ क्या करना है। उत्तर ओपी और भविष्य के आगंतुकों को उनकी समस्या को कैसे डीबग करें और कैसे ठीक करें, इस पर मार्गदर्शन देना चाहिए। यह बताते हुए कि आपके कोड के पीछे का विचार क्या है, इस मुद्दे को समझने और आपके समाधान को लागू करने या संशोधित करने में बहुत मदद करता है।
पलक


3

यह मेरे कोड की एक कार्यशील प्रतिलिपि है, यह जांचें कि कैसे sql में दिनांक से दिन का नाम पुनर्प्राप्त किया जाए

CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData] 
@FromDate date,
@ToDate date

As 
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from 
ProjectTimeSheet pts 
join Projects p on pts.ProjectID=p.ID 
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END

1

यदि आप निर्भर @@DATEFIRSTया उपयोग नहीं करना चाहते हैं DATEPART(weekday, DateColumn), तो सप्ताह के दिन की गणना स्वयं करें।

सोमवार आधारित सप्ताह (यूरोप) के लिए सबसे सरल है:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay

रविवार आधारित सप्ताह (अमेरिका) के लिए:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay

यह 1 जनवरी से सप्ताहिक संख्या (1 से 7) क्रमशः 7 जनवरी, 1753 को लौटाता है।


1

आप उपयोग कर सकते हैं DATEPART(dw, GETDATE())लेकिन इस बात से अवगत रहें कि परिणाम SQL सर्वर सेटिंग @@DATEFIRSTमान पर निर्भर करेगा जो कि सप्ताह की सेटिंग का पहला दिन है (यूरोप में डिफ़ॉल्ट मान 7 जो कि रविवार है)।

यदि आप सप्ताह के पहले दिन को दूसरे मूल्य में बदलना चाहते हैं, तो आप उपयोग कर सकते हैं SET DATEFIRSTलेकिन यह आपके क्वेरी सत्र में हर जगह प्रभावित हो सकता है जो आप नहीं चाहते हैं।

वैकल्पिक तरीका पैरामीटर के रूप में सप्ताह के मूल्य के पहले दिन को स्पष्ट रूप से निर्दिष्ट करना है और @@DATEFIRSTसेटिंग पर निर्भर करता है । आप इसे प्राप्त करने के लिए निम्न सूत्र का उपयोग कर सकते हैं:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

जहां @WeekStartDayसप्ताह आप अपने सिस्टम के लिए चाहते हैं के पहले दिन (1 से 7 जो सोमवार से रविवार तक का अर्थ है) है।

मैंने इसे नीचे दिए गए फ़ंक्शन में लपेट दिया है ताकि हम इसे आसानी से पुन: उपयोग कर सकें:

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

उदाहरण उपयोग: GetDayInWeek('2019-02-04 00:00:00', 1)

यह निम्नलिखित (लेकिन SQL सर्वर DATEFIRST सेटिंग से स्वतंत्र) के बराबर है:

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')

0

आपको यह संस्करण उपयोगी लग सकता है।

-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA

select  Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
        (DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
        from #test 

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