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?


@ 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


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

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


12

Menggunakan:

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

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

9

Di SQL server 2012, di bawah ini dapat digunakan

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

Ini memberikan "Jun 2016" yang tepat


6

Bagaimana dengan ini?

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


5

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

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

4

cara terbaik untuk melakukannya adalah dengan:

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

itu akan mempertahankan tipe datetime Anda


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

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!


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)

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


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


0

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


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

Jawaban: MONTH_ Januari Januari September Oktober Desember Oktober September


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

-3

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

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

2
ini bukan fungsi atau pernyataan sql server yang valid
franko_camron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.