Uzyskaj miesiąc i rok z daty i godziny w programie SQL Server 2005

87

Potrzebuję miesiąca + roku od daty i godziny w SQL Server, na przykład „Jan 2008”. Zapytanie grupuję według miesiąca, roku. Szukałem i znalazłem funkcje takie jak datepart, convert itp., Ale żadna z nich nie wydaje się przydatna do tego. Czy coś mi umyka? Czy jest do tego funkcja?

Malik Daud Ahmad Khokhar
źródło
@Evan Carroll - czy to stanowi przejęcie pytania? Jeśli masz lepszą odpowiedź na pytanie, czy nie powinna ona być podawana jako odpowiedź na pytanie, zamiast kierować ludzi do innego pytania?
STLDev
@STLDeveloper jak to porywa. Pytanie dotyczy roku 2005? Nie umieściłem tego tam. Nie szukam roku 2005 .. Niestety, najlepsza odpowiedź tutaj nie działa na rok 2005, jest to rok 2012. Czy powinienem zlekceważyć odpowiedzi z 2005 roku za archaiczne?
Evan Carroll
@STLDeveloper właściwie, nie obchodzi mnie to. =) Moim oficjalnym stanowiskiem zawsze było doradzanie ludziom, aby używali PostgreSQL, nie jestem pewien, dlaczego próbuję pomóc.
Evan Carroll
Wydawało mi się po prostu dziwne, że wróciłeś, aby stworzyć nową wersję pytania dla innej wersji produktu, a następnie odpowiedzieć na to pytanie, co, jak sądzę, jest w porządku.
STLDev

Odpowiedzi:

74

Jeśli masz na myśli, że chcesz je z powrotem jako ciąg, w tym formacie;

SELECT 
  CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120) 
FROM customers

Oto inne opcje formatu

robsoft
źródło
Próbowałem użyć CONVERT (CHAR (4), GetDate (), 100) na moim serwerze SQL i zamiast tego otrzymałem „09 1”. Mam spację i jedną "1" dla 17. za pomocą "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Drzemka
1
To dziwne - z dokumentów, z którymi się łączyłem, 100 powinno zwrócić trzyliterowy skrót miesiąca i spację, jeśli zostanie wrzucony do CHAR (4). Ale wtedy wynik, który opublikowałeś dla CONVERT (varchar, getdate (), 100) wygląda inaczej niż oczekiwałbym. Której wersji SQLServer używasz? Z jakich ustawień lokalizacji / internacjonalizacji korzystasz (nie żeby miało to znaczenie dla formatu 100).
robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
źródło
Więc myślę, że tego właśnie chcę, ale nie widzę, jak TSQL zrozumiałby różnicę między datepart(month,getdate())i datepart(year,getdate()). Co to jest miesiąc i rok ?
jp2code
4
Miesiąc i rok @ jp2code to zasadniczo stałe zdefiniowane tutaj: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL rozumie je tak samo, jak ty, czytając je :)
Zachary Yates,
1
LOL - Dzięki Zach. Gapiłem się na to długo, zanim zorientowałem się w innym miejscu.
jp2code
Znacznie czystszy niż funkcja konwersji. #cleanCode
RBT
51

Począwszy od SQL Server 2012 można używać:

SELECT FORMAT(@date, 'yyyyMM')
CrimsonKing
źródło
1
Dobrze grał ... to odpowiedziała na moje pytanie w 2012 roku
Squ1rr3lz
Cieszę się, że przewinąłem tak daleko, to jest schludne i proste. Dzięki!
Niklas
To jest cenny wkład, ale należało odpowiedzieć gdzie indziej, stackoverflow.com/a/43196370/124486
Evan Carroll
12

Posługiwać się:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month
don
źródło
11

Zabawne, po prostu bawiłem się pisaniem tego samego zapytania w SQL Server, a następnie LINQ.

SELECT 
    DATENAME(mm, article.Created) AS Month, 
    DATENAME(yyyy, article.Created) AS Year, 
    COUNT(*) AS Total 
FROM Articles AS article 
GROUP BY 
    DATENAME(mm, article.Created), 
    DATENAME(yyyy, article.Created) 
ORDER BY Month, Year DESC

Generuje następujący wynik (przykład).

Month | Year | Total

January | 2009 | 2
Mike Geise
źródło
9

W SQL Server 2012 można użyć poniżej

wybierz FORMAT (getdate (), 'MMM yyyy')

To daje dokładny „czerwiec 2016”

program do tworzenia stron internetowych
źródło
6

Co powiesz na to?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
GordyII
źródło
5
( Month(Created) + ',' + Year(Created) ) AS Date
Sampson
źródło
5

Ten format nie istnieje. Musisz zrobić połączenie dwóch rzeczy,

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))
SQLMenace
źródło
4

najlepszym sposobem na to jest:

dateadd(month,datediff(month,0,*your_date*),0)

zachowa twój typ daty i godziny

cyber cyber1621
źródło
1
Jest to zdecydowanie najlepsza odpowiedź na wymuszenie, aby jakakolwiek data była tylko miesiącem i rokiem, pomijając składniki dnia i czasu. Znacznie lepsze niż zaakceptowana odpowiedź, ponieważ informacje można poprawnie sortować i poprawnie funkcjonować jako data w dalszych narzędziach raportowania.
Jamie Thomas
Z całego serca zgadzam się, że jest to zdecydowanie najlepszy sposób na rozpoczęcie miesiąca. Zachowuje typ danych typu datetime i pozostawia renderowanie do frontonu, gdzie powinno. Jest to właściwy sposób wykonywania takich czynności, jak grupowanie wierszy według miesiąca pola.
Jeff Breadner,
2

zwraca pełną nazwę miesiąca, -, pełny rok np March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
źródło
2
Istnieje już 18 innych odpowiedzi na to pytanie. Jakie nowe informacje zawiera Twoja odpowiedź?
stannius
1

Miałem ten sam problem i po rozejrzeniu się znalazłem to:

SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)

Działa świetnie!

Peter Mortensen
źródło
1

Konwersja daty na pierwszy dzień miesiąca umożliwia grupowanie według i porządkowanie według jednego atrybutu i z mojego doświadczenia wynika, że ​​jest to szybsze.

declare @mytable table(mydate datetime)
declare @date datetime
set @date = '19000101'
while @date < getdate() begin
    insert into @mytable values(@date)
    set @date = dateadd(day,1,@date)
end

select count(*) total_records from @mytable

select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt
from @mytable
group by dateadd(month,datediff(month,0,mydate),0)
Ron Smith
źródło
1
---Lalmuni Demos---
create table Users
(
userid int,date_of_birth date
)
---insert values---
insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
Lalmuni Singh
źródło
1
cast(cast(sq.QuotaDate as date) as varchar(7))

podaje format „2006-04”

Gareth Thomas
źródło
1

Pytanie dotyczy SQL Server 2005, wiele odpowiedzi tutaj dotyczy nowszej wersji SQL Server.

select convert (varchar(7), getdate(),20)
--Typical output 2015-04

SQL Server 2005 nie ma funkcji daty, która została wprowadzona w SQL Server 2008

Hammad Khan
źródło
0

Tak, możesz użyć, datename(month,intime)aby wyświetlić miesiąc w tekście.

Alok Kumar
źródło
0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Odpowiedź: MONTH_ styczeń styczeń wrzesień październik grudzień październik wrzesień

khmer angkor
źródło
0

Działa świetnie.

DECLARE @pYear VARCHAR(4)

DECLARE @pMonth VARCHAR(2)

DECLARE @pDay VARCHAR(2)

SET @pYear  = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4)

SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2)

SET @pDay   = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2)

SELECT @pYear,@pMonth,@pDay
GanbatSu
źródło
-3

Poniższe działa idealnie! Po prostu go użyłem, wypróbuj.

date_format(date,'%Y-%c')
Matteo
źródło
2
to nie jest prawidłowa funkcja lub instrukcja serwera sql
franko_camron