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?


@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


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',...)

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


12

Posługiwać się:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month

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


6

Co powiesz na to?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )


5

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

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))

4

najlepszym sposobem na to jest:

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

zachowa twój typ daty i godziny


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()))

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!


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)

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



0

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


0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

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


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

-3

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

date_format(date,'%Y-%c')

2
to nie jest prawidłowa funkcja lub instrukcja serwera sql
franko_camron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.