Sql सर्वर स्ट्रिंग दिनांक रूपांतरण के लिए


186

मैं इस तरह एक स्ट्रिंग परिवर्तित करना चाहते हैं:

'10/15/2008 10:06:32 PM'

Sql सर्वर में बराबर DATETIME मूल्य में।

ओरेकल में, मैं यह कहूंगा:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

इस प्रश्न का अर्थ है कि मुझे एक मानक प्रारूप में स्ट्रिंग को पार्स करना होगा , और फिर उन कोडों में से एक का उपयोग करके परिवर्तित करना होगा। इस तरह के सांसारिक संचालन के लिए यह आकर्षक लगता है। क्या कोई आसान तरीका है?


जवाबों:


28

SQL सर्वर (2005, 2000, 7.0) में कोई भी लचीला या गैर-लचीला नहीं है, स्ट्रिंग प्रारूप में एक मनमाने ढंग से संरचित डेटाइम को लेने और इसे डेटाइम डेटा प्रकार में परिवर्तित करने का तरीका है।

"मनमाने ढंग से" से मेरा अभिप्राय है "एक ऐसा रूप जो उस व्यक्ति ने लिखा है, जो शायद आप या मैं या ग्रह के दूसरी तरफ कोई व्यक्ति नहीं है, यह सहज और पूरी तरह से स्पष्ट माना जाएगा।" सच कहूँ तो, मुझे यकीन नहीं है कि ऐसा कोई एल्गोरिथम है।


32
इस तरह के एक एल्गोरिथ्म है, ओरेकल ने पहले ही इसे लागू कर दिया है, और एसक्यूएल सर्वर की कमी एक निरंतर दर्द है।
माताओ ने

19
@matao तो कृपया हमें बताएं, कि ओरेकल जादुई तरीके से यह कैसे निर्धारित करता है कि टाइप करने वाला उपयोगकर्ता 9/6/126 सितंबर 2012, 9 जून 2012, 6 दिसंबर 2009, या कुछ और है?
आरोन बर्ट्रेंड

13
कोई चिंता नहीं, यहाँ: techonthenet.com/oracle/functions/to_date.php स्पष्ट रूप से यह एक सुसंगत प्रारूप होना चाहिए जिसे आप डेवलपर निर्दिष्ट करते हैं, लेकिन मुट्ठी भर प्रारूप की तुलना में बहुत अधिक लचीला एमएस आपको देता है, जिसके परिणामस्वरूप दर्दनाक कस्टम पार्सिंग होती है। ।
माता

3
@JosphStyons को Oracle के TO_DATE फ़ंक्शन के बारे में पता था, जैसा कि उनके नमूने में दिखाया गया है। वह जानना चाहता था कि क्या स्ट्रिंग के प्रारूप / संरचना को जाने बिना तारीखों के रूप में तार बदलने का एक तरीका था । SQL ऐसा नहीं करता है, और यह निश्चित रूप से प्रतीत होता है कि Oracle का TO_DATE ऐसा नहीं करता है।
फिलिप केली

23
@PhilipKelley मैं नहीं देखता कि ओपी यह जानना चाहता है कि प्रारूप को जाने बिना उसे कैसे करना है। वह स्पष्ट रूप से कहता है कि वह प्रारूप जानता है और यह पूछ रहा है कि क्या SQL सर्वर के पास TO_DATE के बराबर कुछ है, अर्थात ऐसा कुछ जो डेवलपर को एक मनमाना प्रारूप स्ट्रिंग दर्ज करने की अनुमति देता है।
neverfox

305

इसे इस्तेमाल करे

Cast('7/7/2011' as datetime)

तथा

Convert(varchar(30),'7/7/2011',102)

देखें कास्ट और रूपांतरित (Transact-SQL) अधिक जानकारी के लिए।


14
यह करने का सही तरीका है, और इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। ध्यान दें कि Cast('2011-07-07' as datetime)यह भी काम करता है, और महीने और दिन के आदेश पर अस्पष्टता को समाप्त करता है।
जो डेसोस

यह तब काम नहीं करता है जब महीना> 12 है। प्रारूपण मिमी / dd / yyyy प्रारूप की अपेक्षा करता है
चक्री

Dd / mm / yyyy से रूपांतरण करते समय Convert (varchar (30), '7/7/2011', 103) का प्रयोग करें
Matias Masso

2
@ चरखी अगर आपकी SET DATEFORMAT dmyक्वेरी से पहले dd / mm / yyyy उपयोग में है
नाथन ग्रिफ़िथ्स

49

इसे अपने क्वेरी प्रोसेसर के माध्यम से चलाएँ। यह तारीखों और / या बार को इस तरह प्रारूपित करता है और इनमें से एक आपको देना चाहिए जो आप खोज रहे हैं। इसे अनुकूलित करना कठिन होगा:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

47

SQL सर्वर Denali में, आप कुछ ऐसा करने में सक्षम होंगे जो आप देख रहे हैं। लेकिन आप अभी भी किसी भी मनमाने ढंग से परिभाषित निराला तारीख स्ट्रिंग को पारित नहीं कर सकते हैं और एसक्यूएल सर्वर को समायोजित करने की उम्मीद कर सकते हैं। यहाँ एक उदाहरण है जिसे आपने अपने उत्तर में पोस्ट किया है। FORMAT () फ़ंक्शन और स्थानों को एक वैकल्पिक तर्क के रूप में भी स्वीकार कर सकता है - यह .Net के प्रारूप पर आधारित है, इसलिए यदि आपके द्वारा देखे जाने वाले सभी टोकन प्रारूप नहीं हैं तो सबसे अधिक।

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

मैं आपको और अधिक नियंत्रण लेने और अपनी दिनांक जानकारी को पवित्र करने के लिए दृढ़ता से प्रोत्साहित करता हूं। लोगों को यह बताने का दिन है कि वे जिस फॉर्मेट में फ़्रीक्वेस्ट फॉर्म फील्ड में चाहते हैं, उसका इस्तेमाल करके अब तक हमसे पीछे रहे। अगर कोई 8/9/2011 में प्रवेश करता है तो वह 9 अगस्त या 8 सितंबर है? यदि आप उन्हें कैलेंडर नियंत्रण पर तारीख चुनने देते हैं, तो ऐप प्रारूप को नियंत्रित कर सकता है। इससे कोई फर्क नहीं पड़ता कि आप अपने उपयोगकर्ताओं के व्यवहार का अनुमान लगाने की कितनी कोशिश करते हैं, वे हमेशा उस तिथि को दर्ज करने के लिए डम्बर तरीके का पता लगाएंगे जिसकी आपने योजना नहीं बनाई थी।

Denali तक, हालांकि, मुझे लगता है कि @Ovidiu की अब तक की सबसे अच्छी सलाह है ... इसे अपने स्वयं के CLR फ़ंक्शन को लागू करके काफी तुच्छ बनाया जा सकता है। फिर आप जितने चाहें उतने गैर-मानक प्रारूपों के लिए एक केस / स्विच लिख सकते हैं।


UPDATE @dhergert के लिए :

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

परिणाम:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

आपको अभी भी पहले जानकारी के अन्य महत्वपूर्ण टुकड़े की आवश्यकता है। आप यह निर्धारित करने के लिए कि 6/9/20129 जून या 6 सितंबर को देशी T-SQL का उपयोग नहीं कर सकते ।


1
मुझे लगता है कि सवाल यह था कि कैसे एक स्ट्रिंग को डेटाइम में परिवर्तित किया जाए, न कि स्ट्रिंग में डेटाइम को।
डेविड हेरगर्ट 18

1
TRY_PARSE एकदम सही था। हमने एक तारीख 'थू सिप 22 22' को पार्स करने के साथ जारी किया था, साझा करने के लिए धन्यवाद!
साइमन

11

इस समस्या के लिए सबसे अच्छा समाधान जिसका मैं उपयोग करता हूं, वह है Sql Server 2005 में एक CLR फ़ंक्शन जो किसी निर्धारित प्रारूप के साथ DateTime मान को वापस करने के लिए DateTime.Parse या ParseExact फ़ंक्शन में से एक का उपयोग करता है।



8

क्यों नहीं कोशिश करो

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

दिनांक स्वरूप SQL सर्वर हेल्पर> SQL सर्वर दिनांक प्रारूप में पाए जा सकते हैं


आपका कोड उदाहरण काम नहीं करता है। "चरित्र स्ट्रिंग से दिनांक और / या समय परिवर्तित करते समय रूपांतरण विफल रहा।"
सेसर लियोन

5
होना चाहिए select convert(date,'10/15/2011 00:00:00',101)। प्रारूप के बारे में और अधिक जानकारी और 101 क्यों, डॉक्स.मेडिसिन.com
en-

1
आठ लोगों ने इस जवाब को वोट दिया है और यह भी काम नहीं करता है ...
डेविड क्लेम्फनर

4

मुझे यह पता लगाने में एक मिनट का समय लगा, इसलिए यहाँ यह है कि यह किसी की मदद कर सकता है:

SQL सर्वर 2012 और बेहतर में आप इस फ़ंक्शन का उपयोग कर सकते हैं:

SELECT DATEFROMPARTS(2013, 8, 19);

यहां बताया गया है कि इस समारोह में शामिल होने के लिए मैंने तारीख के हिस्सों को कैसे निकाला:

select
DATEFROMPARTS(right(cms.projectedInstallDate,4),left(cms.ProjectedInstallDate,2),right( left(cms.ProjectedInstallDate,5),2)) as 'dateFromParts'
from MyTable

3

इस पृष्ठ में CONVERT फ़ंक्शन के लिए उपलब्ध सभी निर्दिष्ट डेटाटाइम रूपांतरणों के लिए कुछ संदर्भ हैं। यदि आपके मूल्य स्वीकार्य पैटर्न में से एक में नहीं आते हैं, तो मुझे लगता है कि सबसे अच्छी बात ParseExact मार्ग है।


लिंक टूट गया है।
माइकल पॉटर

3

व्यक्तिगत रूप से यदि आपका मनमाना या पूरी तरह से दीवार प्रारूपों से निपटना है, तो बशर्ते कि आप जानते हैं कि वे समय से आगे हैं या होने जा रहे हैं, तो बस उस तिथि के अनुभागों को खींचने के लिए regexp का उपयोग करें और एक वैध दिनांक / डेटाइम घटक बनाएँ।


1

मुझे पता है कि यह एक दुष्ट पुरानी पोस्ट है जिसमें बहुत सारे जवाब हैं लेकिन बहुत से लोग सोचते हैं कि वे चीजों को तोड़ने के लिए या उन्हें वापस एक साथ रखने की आवश्यकता है या वे जोर देकर कहते हैं कि ओपी मूल के रूपांतरण के लिए कोई तरीका नहीं है। ।

एक ही प्रश्न के साथ दूसरों को एक आसान उत्तर देने के लिए समीक्षा करने और उम्मीद करने के लिए, ओपी ने पूछा कि '10 / 15/2008 10:06:32 PM 'को एक DATETIME में कैसे परिवर्तित किया जाए। अब, SQL सर्वर में अस्थायी रूपांतरण के लिए कुछ भाषा निर्भरताएं हैं, लेकिन यदि भाषा अंग्रेजी या कुछ इसी तरह की है, तो यह एक साधारण समस्या बन जाती है ... बस रूपांतरण करें और प्रारूप के बारे में चिंता न करें। उदाहरण के लिए (और आप CONVERT या CAST का उपयोग कर सकते हैं) ...

 SELECT UsingCONVERT = CONVERT(DATETIME,'10/15/2008 10:06:32 PM')
        ,UsingCAST   = CAST('10/15/2008 10:06:32 PM' AS DATETIME)
;

... और जो अनुवर्ती उत्तर उत्पन्न करता है, दोनों सही हैं।

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

जैसे वे टीवी विज्ञापनों पर कहते हैं, "लेकिन रुको! अभी तक ऑर्डर मत करो! कोई अतिरिक्त लागत के लिए, यह अधिक नहीं कर सकता!"

आइए DATETIME के ​​साथ लौकिक रूपांतरणों की वास्तविक शक्ति देखें और DATETIME2 नामक गलती की आंशिक रूप से जांच करें। DATETIME ऑटो-जादुई तरीके से संभाल सकते हैं और DATETIME2 नहीं कर सकते कि अजीब प्रारूपों की जाँच करें। निम्नलिखित कोड चलाएँ और देखें ...

--===== Set the language for this example.
    SET LANGUAGE ENGLISH --Same a US-English
;
--===== Use a table constructor as if it were a table for this example.
 SELECT *
        ,DateTimeCONVERT  = TRY_CONVERT(DATETIME,StringDT)
        ,DateTimeCAST     = TRY_CAST(StringDT AS DATETIME)
        ,DateTime2CONVERT = TRY_CONVERT(DATETIME2,StringDT)
        ,DateTime2CAST    = TRY_CAST(StringDT AS DATETIME2)
   FROM (
         VALUES
         ('Same Format As In The OP'    ,'12/16/2001 01:51:01 PM')
        ,('Almost Normal'               ,'16 December, 2001 1:51:01 PM')
        ,('More Normal'                 ,'December 16, 2001 01:51:01 PM')
        ,('Time Up Front + Spaces'      ,'   13:51:01  16 December   2001')
        ,('Totally Whacky Format #01'   ,'  16  13:51:01  December   2001')
        ,('Totally Whacky Format #02'   ,'  16    December 13:51:01  2001  ')
        ,('Totally Whacky Format #03'   ,'  16    December 01:51:01  PM 2001  ')
        ,('Totally Whacky Format #04'   ,' 2001 16    December 01:51:01  PM ')
        ,('Totally Whacky Format #05'   ,' 2001    December 01:51:01  PM  16  ')
        ,('Totally Whacky Format #06'   ,' 2001 16    December  01:51:01 PM  ')
        ,('Totally Whacky Format #07'   ,' 2001 16    December  13:51:01 PM  ')
        ,('Totally Whacky Format #08'   ,' 2001 16  13:51:01 PM  December    ')
        ,('Totally Whacky Format #09'   ,'   13:51:01   PM  2001.12/16 ')
        ,('Totally Whacky Format #10'   ,'   13:51:01   PM  2001.December/16 ')
        ,('Totally Whacky Format #11'   ,'   13:51:01   PM  2001.Dec/16 ')
        ,('Totally Whacky Format #12'   ,'   13:51:01   PM  2001.Dec.16 ')
        ,('Totally Whacky Format #13'   ,'   13:51:01   PM  2001/Dec.16')
        ,('Totally Whacky Format #14'   ,'   13:51:01   PM  2001 . 12/16 ')
        ,('Totally Whacky Format #15'   ,'   13:51:01   PM  2001 . December / 16 ')
        ,('Totally Whacky Format #16'   ,'   13:51:01   PM  2001 . Dec /   16 ')
        ,('Totally Whacky Format #17'   ,'   13:51:01   PM  2001 . Dec .   16 ')
        ,('Totally Whacky Format #18'   ,'   13:51:01   PM  2001 / Dec .   16')
        ,('Totally Whacky Format #19'   ,'   13:51:01   PM  2001 . Dec -   16 ')
        ,('Totally Whacky Format #20'   ,'   13:51:01   PM  2001 - Dec -   16 ')
        ,('Totally Whacky Format #21'   ,'   13:51:01   PM  2001 - Dec .   16')
        ,('Totally Whacky Format #22'   ,'   13:51:01   PM  2001 - Dec /   16 ')
        ,('Totally Whacky Format #23'   ,'   13:51:01   PM  2001 / Dec -   16')
        ,('Just the year'               ,' 2001      ')
        ,('YYYYMM'                      ,' 200112      ')
        ,('YYYY MMM'                    ,'2001 Dec')
        ,('YYYY-MMM'                    ,'2001-Dec')
        ,('YYYY    .     MMM'           ,'2001    .     Dec')
        ,('YYYY    /     MMM'           ,'2001    /     Dec')
        ,('YYYY    -     MMM'           ,'2001    /     Dec')
        ,('Forgot The Spaces #1'        ,'2001December26')
        ,('Forgot The Spaces #2'        ,'2001Dec26')
        ,('Forgot The Spaces #3'        ,'26December2001')
        ,('Forgot The Spaces #4'        ,'26Dec2001')
        ,('Forgot The Spaces #5'        ,'26Dec2001 13:51:01')
        ,('Forgot The Spaces #6'        ,'26Dec2001 13:51:01PM')
        ,('Oddly, this doesn''t work'   ,'2001-12')
        ,('Oddly, this doesn''t work'   ,'12-2001')
        ) v (Description,StringDT)
;

तो, हाँ ... SQL सर्वर वास्तव में अजीब-ओ लौकिक प्रारूपों के सभी प्रकार से निपटने का एक सुंदर लचीला तरीका है और कोई विशेष हैंडलिंग की आवश्यकता नहीं है। हमें "पीएम" को हटाने की भी आवश्यकता नहीं थी जो 24 घंटे में जोड़े गए थे। यह "पीएफएम" (प्योर फ्रीकिन मैजिक) है।

LANGUAGE के आधार पर चीजें थोड़ी भिन्न होंगी, यह है कि आपने अपने सर्वर के लिए चयन किया है, लेकिन इसमें से बहुत सारे को किसी भी तरह से संभाला जाएगा।

और ये "ऑटो-मैजिक" रूपांतरण कुछ नया नहीं है। वे एक वास्तविक लंबा रास्ता तय करते हैं।


दुष्ट पुराने प्रश्न के लिए एक दुष्ट नया उत्तर। धन्यवाद!
जोसेफटनसन

प्रतिक्रिया के लिए धन्यवाद, @JosephStyons।
जेफ मोदन

0

यदि आप चाहते हैं कि SQL सर्वर इसे आज़माए और इसका पता लगाए, तो बस CAST CAST ('जो भी हो' एएस डेटाइम) का उपयोग करें, हालांकि यह सामान्य रूप से एक बुरा विचार है। अंतरराष्ट्रीय तारीखों के साथ मुद्दे हैं जो सामने आएंगे। इसलिए जैसा कि आपने पाया है, उन मुद्दों से बचने के लिए, आप तिथि के ODBC विहित प्रारूप का उपयोग करना चाहते हैं। वह प्रारूप संख्या 120, 20 सिर्फ दो अंकों के वर्षों के लिए प्रारूप है। मुझे नहीं लगता कि SQL सर्वर में एक अंतर्निहित फ़ंक्शन है जो आपको उपयोगकर्ता द्वारा दिए गए प्रारूप प्रदान करने की अनुमति देता है। यदि आप ऑनलाइन खोज करते हैं, तो आप अपना स्वयं का लिख ​​सकते हैं और एक भी पा सकते हैं


यदि आपके पास एक ही कॉलम में अंतर्राष्ट्रीय तारीखें हैं, तो मैं बिल्कुल सहमत हूं कि प्रारूप संख्या का उपयोग करना एक अच्छा विचार है। यदि आपके पास अंतर्राष्ट्रीय तिथियां और यूएस तिथियां सभी एक ही कॉलम में मिश्रित हैं, तो 7/6/2000 और 6/7/2000 जैसे कुछ के बीच अंतर को निर्धारित करने का कोई तरीका नहीं है जब तक कि आपके पास एक बहन कॉलम नहीं है जो प्रारूप को समझाता है। यही कारण है कि स्रोत पर डेटा की गुणवत्ता बस एक बात होनी चाहिए। यदि आप जानते हैं कि आपके पास सभी अमेरिकी तिथियां हैं, तो बताएं कि अंतर्निहित रूपांतरण उनकी बात करते हैं। यदि वे विफल होते हैं, तो आप यह सुनिश्चित करने के लिए जानते हैं कि कॉलम में कुछ तय करने की आवश्यकता है।
जेफ मोदेन

0

MSSQL में सख्ती से स्ट्रिंग को डेटाइम में बदलें

create table tmp 
(
  ENTRYDATETIME datetime
);

insert into tmp (ENTRYDATETIME) values (getdate());
insert into tmp (ENTRYDATETIME) values ('20190101');  --convert string 'yyyymmdd' to datetime


select * from tmp where ENTRYDATETIME > '20190925'  --yyyymmdd 
select * from tmp where ENTRYDATETIME > '20190925 12:11:09.555'--yyyymmdd HH:MIN:SS:MS



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

-4
dateadd(day,0,'10/15/2008 10:06:32 PM')

3
StackOverflow में आपका स्वागत है! कृपया अपने कोड के लिए स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें । यह सवाल लगभग ग्यारह साल पुराना है , और पहले से ही कई अच्छी तरह से समझाया गया है, उत्कीर्ण जवाब। आपके उत्तर में एक स्पष्टीकरण के बिना , यह इन दूसरों की तुलना में बहुत कम गुणवत्ता का है और सबसे अधिक संभावना कम हो जाएगी या हटा दी जाएगी। उस स्पष्टीकरण को जोड़ने से आपके उत्तर के अस्तित्व को सही ठहराने में मदद मिलेगी।
दास_गीक

हाँ, लेकिन "अच्छी तरह से समझाया गया" पोस्ट, यहां तक ​​कि ऊपर वाले भी बहुत जटिल हैं। यहां पोस्ट किया गया एक वास्तव में बेहतर विवरणों में से एक है, एक स्पष्टीकरण के साथ या बिना
जेफ मोदेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.