2013-02-20 12 views
31

Mam kolumnę całkowitą "Miesiąc" Chciałbym uzyskać 2-cyfrowy numer na miesiąc.Uzyskaj 2 cyfry na miesiąc

To co próbowałem: DATEPART (mm @date)

Zwraca jedną cyfrę za miesiące styczeń-wrzesień Używam SQL Server 2008

Ktoś ma pomysł?

+0

Patrz wątek o wiele opcji: http://stackoverflow.com/questions/1914682/t-sql-format-integer-to -2-cyfrowy-ciąg –

+1

Natknąłem się na to z tym samym pytaniem, ale dla SQL Server 2012. Na podstawie odpowiedzi użytkownika3829053 opracowałem, że dla tej wersji przynajmniej wybierz format (miesiąc (@Date), '00'), lub wybierz format (datepart (mm, @Date), "00") działa. – David

Odpowiedz

44

istnieją różne sposoby to zrobić

  • Korzystanie z RTRIM i określanie zakres:

jak

SELECT RIGHT('0' + RTRIM(MONTH('12-31-2012')), 2); 
  • Korzystanie podciąg tylko wyodrębnić część miesiąc po konwersji datę na tekst

jak

SELECT SUBSTRING(CONVERT(nvarchar(6),getdate(), 112),5,2) 

zobaczyć Fiddle

Mogą istnieć inne sposoby, aby zdobyć to.

+0

Nie otrzymuję wiodącego zera. Ponieważ typ kolumny jest liczbą całkowitą, w jaki sposób będzie to miało wpływ na wynik? Czy typ kolumny musi być zwrócony, aby działał? – Adam

+0

wydaje się, że typ atlasu musi być char. Wtedy otrzymuję pożądany wynik. Przypuszczam, że nie ma sposobu, aby uzyskać taki sam wynik z liczbą całkowitą jak typ atrubutte. Lub? – Adam

+0

będzie to znacznie łatwiejsze, jeśli zmienisz format miesiąca, w którym chcesz porównać miesiąc. np. jeśli otrzymasz wartość @month int = 2 i chcesz porównać wartość/@ month_compare varchar (20) z wartością '02', po prostu prześlij/@ month_compare do int, zanim to zrobisz, zmień typ danych kolumna miesiąca. –

1

dołączająca 0 do niego przez sprawdzenie, czy wartość mieści się między 1 a 9 przez pierwszą odlewania do varchar

select case when DATEPART(month, getdate()) between 1 and 9 
then '0' else '' end + cast(DATEPART(month, getdate()) as varchar(2)) 
+0

typem atrybutu jest liczba całkowita. – Adam

3

Alternatywa DATEPART

SELECT LEFT(CONVERT(CHAR(20), GETDATE(), 101), 2) 
12

Pinal Dave ma fajny artykuł z kilkoma przykładami jak to zrobić add trailing 0s to SQL numbers.

Jednym ze sposobów jest użycie funkcji RIGHT, która stałaby się coś oświadczenie jak następuje:

SELECT RIGHT('00' + CAST(DATEPART(mm, @date) AS varchar(2)), 2) 
+0

Nie uzyskuję pożądanego rezultatu. jest to możliwe, że serwer zarządzania serwerem sql jest ustawiony na ignorowanie wiodących wartości null? – Adam

+0

@Adam - spróbuj sprawdzić, czy zastąpienie @ datate przez 'GETDATE()' robi różnicę? – SchmitzIT

1

Spróbuj:

select right ('0'+convert(nvarchar(2), DATEPART(mm, getdate())),2) 
35

Funkcja

FORMAT(date,'MM') 

będzie wykonać zadanie z dwóch cyfr.

+4

Dodano w SQL Server 2012. Pytanie podaje użycie 2008. – mcNux

+1

Szukałem rozwiązania takiego jak to, ponieważ znam tę funkcję z Pythona. Właściwie nie wiedziałem, że jest nowy od 2012. –

+0

To działało świetnie! Uwaga, że ​​wymaga to, aby dane wejściowe były zmiennymi daty, a nie tylko wyglądały jak np. FORMAT ("2017-01-01", "MM") kończy się niepowodzeniem, ale działa FORMAT (GETDATE(), "MM"). – Scott

5

Kolejny prosty trik:

SELECT CONVERT(char(2), cast('2015-01-01' as datetime), 101) -- month with 2 digits 
SELECT CONVERT(char(6), cast('2015-01-01' as datetime), 112) -- year (yyyy) and month (mm) 

Wyjścia:

01 
201501 
0

Dla mnie najszybszym rozwiązaniem było

DATE_FORMAT(CURDATE(),'%m') 
+0

To nie jest serwer tsql ani Sql 2008, który został oznaczony w pytaniu. – Thronk

0

Wystarczy można stosować:

SELECT RIGHT('0' + CAST(MONTH(@Date) AS NVARCHAR(2)), 2) 
0

Mój sposób to zrobić to:

right('0'+right(datepart(month,[StartDate]),2),2) 

Powodem „right” Funkcja interanl jest zapobieganie SQL z matematyki robi to jako dodatek - co pozostawi nas z jednej cyfry ponownie.

1

konwertowania (znak (2) getdate(), 101)