Uzyskiwanie tylko miesiąca i roku z SQL DATE


Odpowiedzi:


170

Oprócz podanych już sugestii jest jeszcze jedna możliwość, którą mogę wywnioskować z twojego pytania:
- Nadal chcesz, aby wynik był datą
- Ale chcesz `` odrzucić '' dni, godziny itp.
- Opuszczenie roku / miesiąca tylko pole daty

SELECT
   DATEADD(MONTH, DATEDIFF(MONTH, 0, <dateField>), 0) AS [year_month_date_field]
FROM
   <your_table>

Pobiera liczbę pełnych miesięcy od daty bazowej (0), a następnie dodaje je do tej daty bazowej. W ten sposób zaokrąglamy w dół do miesiąca, w którym przypada data.

UWAGA: W SQL Server 2008 nadal będziesz mieć dołączony TIME jako 00: 00: 00.000. To nie jest dokładnie to samo, co „usunięcie” jakiegokolwiek zapisu dnia i godziny. Również DZIEŃ ustawiony na pierwszy. np. 2009-10-01 00: 00: 00.000


1
To w ogóle mi się nie udało. Daje mi wynik 2023-02-01 00: 00: 00.000.
Dss

1
@dss - z jakimi parametrami? Pokaż aktualny kod SQL i cieszę się, że mogę go obejrzeć.
MatBailie,

@MatBailie SELECT DATEADD (MONTH, DATEDIFF (MONTH, 0, LastSaleDate), 0) AS [year_month_date_field] FROM db1.products gdzie productID = 123 Kolumna „LastSaleDate” jest zadeklarowana jako „(datetime, not null)” i otrzymuję: 2014-09-01 00: 00: 00.000
Dss

1
@DSS - Tak, to wygląda na poprawne. Zaokrągla w dół do samego początku września 2014 r. Nie ma typu danych „Tylko rok i miesiąc”, więc standardową praktyką jest używanie pierwszego momentu każdego miesiąca. Konwertując tę ​​wartość DATETIME na ciąg (Warstwa aplikacji, Warstwa prezentacji, Warstwa raportowania itp.), Zawsze można sformatować ją tylko z częściami roku i miesiąca. Ale pod względem manipulacji danymi „w bazie danych” jest to poprawne.
MatBailie

Myślę, że może dlatego, że twoja odpowiedź miała być używana z polem „Data”, ale ja używam pola „data i godzina”, więc prawdopodobnie w tym tkwi problem.
Dss

133
select month(dateField), year(dateField)

2
świetny! Możesz połączyć je z jedną kolumną: „select cast (month (dateField) as varchar) +”. + cast (year (dateField) as varchar) '
izik f


32
SELECT DATEPART(yy, DateVal)
SELECT DATEPART(MM, DateVal)
SELECT DATENAME(MM, DateVal)

2
SELECT DATEPART (MM, DateVal) nie zwraca „MM”. Jeśli miesiąc zawiera się w przedziale 1-9, zwraca tylko jedną cyfrę.
Jaikrat

Zamiast „MM” powinno być napisane „miesiąc”: „WYBIERZ DATEPART (miesiąc, getdate ())”
Renne007

17
datename(m,column)+' '+cast(datepart(yyyy,column) as varchar) as MonthYear

wynik będzie wyglądał następująco: „Grudzień 2013”


15

Służą do tego dwie funkcje SQL:

Szczegółowe informacje można znaleźć w dołączonej dokumentacji.


5
Proponuję podać przynajmniej kilka krótkich przykładów, ponieważ linki nie zawsze pozostają na zawsze… W rzeczywistości nie są już dobre.
Carol

12

To również może być pomocne.

SELECT YEAR(0), MONTH(0), DAY(0);

lub

SELECT YEAR(getdate()), MONTH(getdate()), DAY(getdate());

lub

SELECT YEAR(yourDateField), MONTH(yourDateField), DAY(yourDateField);

W każdym razie, aby nie usunąć „0” w polu zwrotu?
Si8


10
convert(varchar(7), <date_field>, 120)
because 120 results in 'yyyy-MM-dd' which is varchar(10)
using varchar(7) will display only year and month

example:
select convert(varchar(7), <date_field>, 120), COUNT(*)
from <some_table>
group by convert(varchar(7), <date_field>, 120)
order by 1

6

Twoje pytanie interpretuję na dwa sposoby.

a) Potrzebujesz tylko miesiąca i roku osobno, w takim przypadku oto odpowiedź

select 
        [YEAR] = YEAR(getdate())
        ,[YEAR] = DATEPART(YY,getdate())
        , [MONTH] = month(getdate())
        ,[MONTH] = DATEPART(mm,getdate())
        ,[MONTH NAME] = DATENAME(mm, getdate()) 

b)

Chcesz wyświetlać od podanej daty, powiedzmy '2009-11-24 09:01:55.483'w formacie MIESIĄC.ROK . Więc wyjście powinno wyglądać jak 11.2009w tym przypadku.

Jeśli tak ma być, spróbuj tego (wśród innych alternatyw)

select [Month.Year] = STUFF(CONVERT(varchar(10), GETDATE(),104),1,3,'')

5

Niektóre bazy danych, takie jak MS ACCESSlub RODBCmogą nie obsługiwać SQL SERVERfunkcji, ale w przypadku dowolnej bazy danych, która ma tę FORMATfunkcję, możesz po prostu zrobić to:

SELECT FORMAT(<your-date-field>,"YYYY-MM") AS year-date FROM <your-table>


3
CONCAT (datepart (yy,DATE), FORMAT (DATE,'MM')) 

daje np. 201601, jeśli chcesz uzyskać sześciocyfrowy wynik


2

Spróbuj tego

select to_char(DATEFIELD,'MON') from YOUR_TABLE

na przykład.

select to_char(sysdate, 'MON') from dual

2

Spróbuj tego:

portugalski

SELECT format(dateadd(month, 0, getdate()), 'MMMM', 'pt-pt') + ' ' + convert(varchar(10),year(getdate()),100)

Wynik: maio 2019


język angielski

SELECT format(dateadd(month, 0, getdate()), 'MMMM', 'en-US') + ' ' + convert(varchar(10),year(getdate()),100)

Wynik: maj 2019

Jeśli chcesz w innym języku, zmień „ pt-pt ” lub „ en-US ” na dowolny z tych w linku


1

Miałem konkretny wymóg zrobienia czegoś podobnego, w którym pokazywałby miesiąc-rok, co można zrobić w następujący sposób:

SELECT DATENAME(month, GETDATE()) + '-' + CAST(YEAR(GETDATE()) AS nvarchar) AS 'Month-Year'

W moim konkretnym przypadku musiałem to sprowadzić do 3-literowego skrótu miesiąca z 2-cyfrowym rokiem, wyglądającym mniej więcej tak: SELECT LEFT(DATENAME(month, GETDATE()), 3) + '-' + CAST(RIGHT(YEAR(GETDATE()),2) AS nvarchar(2)) AS 'Month-Year'


1

Próbować SELECT CONCAT(month(datefield), '.', year(datefield)) FROM YOURTABLE;


0

Moja baza danych nie obsługuje większości powyższych funkcji, jednak stwierdziłem, że to działa:

SELECT * FROM table WHERE SUBSTR(datetime_column, starting_position, number_of_strings)=required_year_and_month;

na przykład: SELECT SUBSTR(created, 1,7) FROM table;

zwraca rok i miesiąc w formacie „rrrr-mm”


0

Uzyskaj miesiąc i rok od daty

DECLARE @lcMonth nvarchar(10)
DECLARE @lcYear nvarchar(10)

SET @lcYear=(SELECT  DATEPART(YEAR,@Date))
SET @lcMonth=(SELECT  DATEPART(MONTH,@Date))

0
SELECT REPLACE(RIGHT(CONVERT(VARCHAR(11), GETDATE(), 106), 8), ' ', '-')

Wynik: marzec-2019


0

Zapytanie: - Select datename(m,GETDATE())+'-'+cast(datepart(yyyy,GETDATE()) as varchar) as FieldName

Wyjście: - styczeń-2019

ogólne pole daty, którego możemy użyć

datename(m,<DateField>)+' '+cast(datepart(yyyy,<DateField>) as varchar) as FieldName

0

Wynik: „RRRR-MM”

SELECT cast(YEAR(<DateColumn>) as varchar) + '-' + cast(Month(<DateColumn>) as varchar)

0
select convert(varchar(11), transfer_date, 106) 

dostałem mój pożądany wynik w formacie daty w formacie 07 Mar 2018

Moja kolumna „transfer_date” to kolumna typu data-godzina i używam programu SQL Server 2017 na platformie Azure


0

wybierz CONCAT (MIESIĄC (GETDATE ()), „.”, ROK (GETDATE ()))

Wynik : 5.2020

wybierz CONCAT (DATENAME (MIESIĄC, GETDATE ()), „.”, ROK (GETDATE ()))

Wyjście: maj 2020

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.