Dapatkan bulan dan tahun dari datetime di SQL Server 2005

87

Saya membutuhkan bulan + tahun dari datetime di SQL Server seperti 'Jan 2008'. Saya mengelompokkan kueri berdasarkan bulan, tahun. Saya telah mencari dan menemukan fungsi seperti datepart, convert, dll., Tetapi tidak ada yang berguna untuk ini. Apakah saya melewatkan sesuatu di sini? Apakah ada fungsi untuk ini?

Malik Daud Ahmad Khokhar
sumber
@ Evan Carroll - apakah ini merupakan pertanyaan yang dibajak? Jika Anda memiliki jawaban yang lebih baik untuk pertanyaan tersebut, bukankah seharusnya itu diberikan sebagai jawaban atas pertanyaan daripada mengarahkan orang ke pertanyaan yang berbeda?
STLDev
@STLDeveloper bagaimana itu membajak. Pertanyaannya untuk tahun 2005? Saya tidak menaruhnya di sana. Saya tidak mencari tahun 2005 .. Sayangnya, jawaban terbaik di sini tidak berfungsi pada tahun 2005, melainkan tahun 2012 secara eksplisit. Haruskah saya meremehkan jawaban tahun 2005 karena kuno?
Evan Carroll
@STLDeveloper sebenarnya, saya tidak peduli di sini. =) sikap resmi saya selalu menyarankan orang untuk menggunakan PostgreSQL, tidak yakin mengapa saya mencoba membantu.
Evan Carroll
Tampaknya aneh bagi saya bahwa Anda kembali untuk membuat versi baru pertanyaan untuk versi produk yang berbeda, dan kemudian menjawab pertanyaan itu, yang menurut saya tidak masalah.
STLDev

Jawaban:

75

Jika Anda maksud Anda ingin mereka kembali sebagai string, dalam format itu;

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

Berikut adalah opsi format lainnya

robsoft
sumber
Saya mencoba menggunakan CONVERT (CHAR (4), GetDate (), 100) di SQL Server saya dan saya mendapatkan "09 1" sebagai gantinya. Saya mendapat ruang dan satu "1" untuk 17. menggunakan "pilih CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Tidur
1
Aneh - dari dokumen yang saya tautkan, 100 harus mengembalikan singkatan bulan tiga huruf dan spasi, jika dimasukkan ke dalam CHAR (4). Tapi kemudian, hasil yang Anda posting untuk CONVERT (varchar, getdate (), 100) terlihat berbeda dari yang saya harapkan. Versi SQLServer mana yang Anda gunakan? Setelan pelokalan / internasionalisasi mana yang Anda gunakan (bukan berarti ini penting untuk format 100).
robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
sumber
Jadi, saya pikir inilah yang saya inginkan, tetapi saya tidak melihat bagaimana TSQL akan memahami perbedaan antara datepart(month,getdate())dan datepart(year,getdate()). Apakah bulan dan tahun itu ?
jp2code
4
@ jp2code bulan dan tahun pada dasarnya adalah konstanta yang ditentukan di sini: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL memahaminya dengan cara yang sama seperti Anda, dengan membacanya :)
Zachary Yates
1
LOL - Terima kasih Zach. Saya membintangi itu lama sebelum memahaminya di situs lain.
jp2code
Jauh lebih bersih daripada fungsi konversi. #cleanCode
RBT
52

Mulai SQL Server 2012, Anda dapat menggunakan:

SELECT FORMAT(@date, 'yyyyMM')
CrimsonKing
sumber
1
Bagus Pak ... ini menjawab pertanyaan saya pada tahun 2012
Squ1rr3lz
Saya senang saya menggulir sejauh ini, ini rapi dan sederhana. Terima kasih!
Niklas
Ini adalah kontribusi yang berharga tetapi seharusnya dijawab di tempat lain, stackoverflow.com/a/43196370/124486
Evan Carroll
12

Menggunakan:

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

Lucu, saya hanya bermain-main menulis kueri yang sama ini di SQL Server dan kemudian 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

Ini menghasilkan ouput berikut (contoh).

Month | Year | Total

January | 2009 | 2
Mike Geise
sumber
9

Di SQL server 2012, di bawah ini dapat digunakan

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

Ini memberikan "Jun 2016" yang tepat

pembuat web
sumber
6

Bagaimana dengan ini?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
GordyII
sumber
5
( Month(Created) + ',' + Year(Created) ) AS Date
Sampson
sumber
5

Format itu tidak ada. Anda perlu melakukan kombinasi dua hal,

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

cara terbaik untuk melakukannya adalah dengan:

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

itu akan mempertahankan tipe datetime Anda

cyber cyber1621
sumber
1
Sejauh ini, ini adalah jawaban terbaik untuk memaksa tanggal apa pun menjadi hanya bulan dan tahun, mengabaikan komponen hari dan waktu. Jauh lebih baik daripada jawaban yang diterima karena informasi dapat diurutkan dengan benar dan berfungsi dengan benar sebagai tanggal di alat pelaporan hilir.
Jamie Thomas
Saya dengan sepenuh hati setuju bahwa sejauh ini cara terbaik untuk memulai bulan. Itu membuat tipe data datetime, dan membiarkan rendering ke ujung depan, di mana seharusnya. Ini adalah cara yang benar untuk melakukan hal-hal seperti mengelompokkan baris menurut bulan bidang.
Jeff Breadner
2

mengembalikan nama bulan penuh, -, misalnya setahun penuh March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
sumber
2
Sudah ada 18 jawaban lain untuk pertanyaan ini. Informasi baru apa yang ditambahkan jawaban Anda?
stannius
1

Saya memiliki masalah yang sama dan setelah melihat sekeliling saya menemukan ini:

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

Ini bekerja dengan baik!

Peter Mortensen
sumber
1

Mengubah tanggal menjadi yang pertama setiap bulan memungkinkan Anda untuk Mengelompokkan Berdasarkan dan Memesan Berdasarkan satu atribut, dan itu lebih cepat menurut pengalaman saya.

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
sumber
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
sumber
1
cast(cast(sq.QuotaDate as date) as varchar(7))

memberikan format "2006-04"

Gareth Thomas
sumber
1

Pertanyaannya adalah tentang SQL Server 2005, banyak jawaban di sini adalah untuk versi SQL Server yang lebih baru.

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

SQL Server 2005 tidak memiliki fungsi tanggal yang diperkenalkan di SQL Server 2008

Hammad Khan
sumber
0

Ya, Anda dapat menggunakan datename(month,intime)untuk mendapatkan bulan dalam teks.

Alok Kumar
sumber
0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Jawaban: MONTH_ Januari Januari September Oktober Desember Oktober September

khmer angkor
sumber
0

Ini bekerja dengan baik.

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
sumber
-3

Berikut ini bekerja dengan sempurna! Saya baru saja menggunakannya, coba saja.

date_format(date,'%Y-%c')
Matteo
sumber
2
ini bukan fungsi atau pernyataan sql server yang valid
franko_camron