SQL'de Ay Numarasını Ay Adı İşlevine Dönüştür


210

SQL Server'da 1,2,3,4, 12 olarak depoladığım aylar var. Onları Ocak, Şubat vb. Olarak görüntülemek istiyorum. SQL Server'da MonthName (1) = Ocak gibi bir işlevi var mı? Mümkünse bir CASE deyiminden kaçınmaya çalışıyorum.

Yanıtlar:


158

Biraz hacky ama çalışmalı:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))

2
Neden '-1'? SQL Server'daki aylar bir tarafından dengelendiği için buna gerek var mı?
Hassan Gulzar

2
@ DoomerDGR8 aslında dateadd işlevini tohumlamak için kullanılan tarihin 1'de başlaması nedeniyle. Ocak'ın tarihine ihtiyacımız olursa, 2008-01-01'e 1 ay ekleyeceğiz, bu da bize 2008-02-01'i verecek, Şubat. bu yüzden bunu hesaba katmak için 1 çıkarırız ve tekrar Ocak alırız.
DForck42

Tarih saatinizden 1 çıkarma sorununu çözmek için, Ocak ayının aksine Aralık ayında bir tarih saati kullanın. Örneğin, DATENAME SEÇİN (ay, DATEADD (ay, @tarih, CAST ('1978-12-01' tarih olarak)))
Steve Matthews

3
Bu iyi bir bilgi parçasıdır, ancak bir ay numarasının bir ay adına nasıl dönüştürüleceği sorusuna gerçekten cevap vermez (Aksine, bir tarihten bir ay adının nasıl alınacağını cevaplar). Sadece ay sayısı yerine tarih-saat değerine sahip olduğunu varsaydınız; bunun işe yaraması için şimdi bir tarih / saat değeri 'icat etmeniz' gerekir. Leoinfo gelen çözüm biraz daha alakalıydı düşünün
schizoid04

277

Ay numarasını aldığınızda ay adını almanın en iyi yolu olduğunu düşünüyorum

Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

Veya

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )

24
okunabilirlik amacıyla aslında şöyle yazardım: DateName'i seçin (ay, DateAdd (ay, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken

10
olası bir alternatif çözüm DateName'i seçin (ay, DateAdd (ay, @MonthNumber, -1))
Asif

4
Mükemmel. Cevap bu olmalı.
gotqn

94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'

3
SO sorulduğu gibi, ay numarası değil tarihe göre ay adı alıyor.
Imad

72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)

9
Bu sol alan alternatif düşünme biçimini seviyorum! Düşünce için yiyecek
Michael Rodrigues

2
Ve bu deterministik! Hesaplanmış sütun olarak da kullanılabilir, teşekkürler!
Irawan Soetomo

1
güzel ... ben ay [#] ay almak için bazı basit kod arıyordu ve bu harika çalıştı. birkaç ay görüntülemek için, sadece böyle bir şeye geçin >> SUBSTRING ('JAN FEB MAR NİSAN HAZİRAN TEMMUZ AĞUSTOS EYLÜL EKİM KASIM ARALIK', 0, (@intMonth * 4))
Pablo Contreras

2
Bunu kesinlikle "doğru yol" olarak düşünmezdim, ama diğer sorunları çözmek için kullanılabilecek eğlenceli bir yol.
Paul

31

En İyi Yolu Kullanın

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))

21

O çok basit.

select DATENAME(month, getdate())

çıktı: Ocak


4
Bu yalnızca bir ay tamsayısı değil, tam bir tarih değeriniz varsa çalışır.
gunr2171

2
Bu sorunun cevabı değil. MonthName (1) gibi bir fonksiyonun nasıl uygulanacağını soruyor.
Amuliar

8

Dahili CONVERTişlevi kullanabilirsiniz

select CONVERT(varchar(3), Date, 100)  as Month from MyTable.

Bu, ayın ilk 3 karakterini görüntüler (JAN, FEB vb.)


7

orijinaline ek olarak

SELECT DATENAME(m, str(2) + '/1/2011')

Bunu yapabilirsiniz

SELECT DATENAME(m, str([column_name]) + '/1/2011')

bu şekilde bir tablodaki tüm satırların adlarını alırsınız. burada [sütun_adı] 1 ile 12 arasındaki sayısal değerleri içeren bir tamsayıyı temsil eder

2 herhangi bir tamsayıyı temsil eder, temas dizesi ile i ay ayıklayabilirsiniz bir tarih oluşturdu. '/ 1/2011' herhangi bir tarih olabilir

bunu değişkenle yapmak istiyorsanız

DECLARE @integer int;

SET @integer = 6;

SELECT DATENAME(m, str(@integer) + '/1/2011')

7

Aşağıdakiler benim için çalışıyor:

CAST(GETDATE() AS CHAR(3))

6

Ay sayısal değerini Ay adına dönüştürmek için bu ifadeyi kullanın.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))

Yanılmıyorsam OP'nin istediği gibi bir tamsayı kullanmıyor.
akın

5

İbranice gibi bazı yerel bölgelerde , yıla bağlı artık aylar vardır, bu nedenle bu tür yerellerdeki hatalardan kaçınmak için aşağıdaki çözümü düşünebilirsiniz:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     

1
SQL'de bir tarihi Yahudi bir tarihe dönüştürme işlevi var mı? Ben bilmiyorum ...
Hila DG

Yahudi tarihine dönüştürme işlevi: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ


5

SQL Server 2012 ile başlayarak, bu sorunu çözmek için FORMAT ve DATEFROMPARTS kullanabilirsiniz. (Eğer değişim diğer kültürlerden ay adlarını isterseniz: en-US)

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')

Üç harfli bir ay istiyorsanız:

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMM', 'en-US')

Gerçekten istiyorsanız, bunun için bir işlev oluşturabilirsiniz:

CREATE FUNCTION fn_month_num_to_name
(
    @month_num tinyint
)
RETURNS varchar(20)
AS
BEGIN
    RETURN FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')
END

Aradığım şey bu. Çözüm için teşekkürler.
Abdullah Al Mamun

Muhtemelen en verimli değil, ama muhtemelen en kolay okunabilir.
Paul

1
Lokalizasyonu bile destekler! .. tatlı!
Rosdi Kasım

4

Convert functin'i aşağıdaki gibi kullanabilirsiniz

CONVERT(VARCHAR(3), DATENAME(MM, GETDATE()), 100)

4

Geçerli ayı bugünün tarihinden çıkarın, ardından ay numaranızı geri ekleyin. Ardından, tam adı 1 satırda vermek için datename işlevini kullanın.

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))

3

bu u tarih olduğunda ay adı almak için yeterli olduğunu düşünüyorum.

SELECT DATENAME(month ,GETDATE())


3

Ay numarasını ay adına dönüştürmek için aşağıdakileri deneyin

declare @month smallint = 1
select DateName(mm,DATEADD(mm,@month - 1,0))

3
SELECT DATENAME(MONTH,dateadd(month, -3,getdate()))

1

Bu benim için çalıştı:

@MetricMonthNumber (some number)

SELECT 
(DateName( month , DateAdd( month , @MetricMonthNumber - 1 , '1900-01-01' ) )) AS MetricMonthName
FROM TableName

@Leoinfo ve @Valentino Vranken'den yukarıdaki yazıdan. Sadece hızlı bir seçim yaptı ve işe yarıyor.


1
Declare @MonthNumber int
SET @MonthNumber=DatePart(Month,GETDATE())
Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

Açıklama:

  1. İlk Decalre Değişkeni MonthNumber
  2. DatePartİade Ayı Numarasının Bulunduğu Geçerli Ayı Al
  3. Üçüncü Sorgu Dönüş Ayı Adı

1
select monthname(curdate());

VEYA

select monthname('2013-12-12');

1

Benim için çalışıyorum

SELECT MONTHNAME(<fieldname>) AS "Month Name" FROM <tablename> WHERE <condition>

1

tarihi böyle alabilirsiniz. ör .: Kullanıcı tablosu

id name created_at
1  abc  2017-09-16
2  xyz  2017-06-10

ay adını böyle alabilirsin

select year(created_at), monthname(created_at) from users;

çıktı

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |


OP mysql değil sql-server istedi.
tavalendo

0

Ay adını almak için bu ifadeyi kullanın:

DECLARE @date datetime
SET @date='2015/1/4 00:00:00'

SELECT CAST(DATENAME(month,@date )  AS CHAR(3))AS 'Month Name'

Bu size kısa ay adı verecektir. Şunun gibi: Jan, Feb, Mar, vb.


0

İşte bir sorunu çözmek için başkalarından bazı bilgiler kullanarak benim çözüm.

datename(month,dateadd(month,datepart(month,Help_HelpMain.Ticket_Closed_Date),-1)) as monthname

0

SQL sunucusunda sistem tanımlı bir işlev yoktur. Ancak kendi kullanıcı tanımlı fonksiyonunuzu yaratabilirsiniz - skaler fonksiyon. Veritabanınız için Nesne Gezgini'nde skaler fonksiyonları bulabilirsiniz: Programlanabilirlik-> Fonksiyonlar-> Skaler değerli Fonksiyonlar. Aşağıda, hepsini bir araya getirmek için bir tablo değişkeni kullanıyorum.

--Create the user-defined function
CREATE FUNCTION getmonth (@num int)
RETURNS varchar(9) --since 'September' is the longest string, length 9
AS
BEGIN

DECLARE @intMonth Table (num int PRIMARY KEY IDENTITY(1,1), month varchar(9))

INSERT INTO @intMonth VALUES ('January'), ('February'), ('March'), ('April'), ('May')
                           , ('June'), ('July'), ('August') ,('September'), ('October')
                           , ('November'), ('December')

RETURN (SELECT I.month
        FROM @intMonth I
        WHERE I.num = @num)
END
GO

--Use the function for various months
SELECT dbo.getmonth(4) AS [Month]
SELECT dbo.getmonth(5) AS [Month]
SELECT dbo.getmonth(6) AS [Month]

0

Ay oluşturmak için böyle bir işlev oluşturabilir ve SELECT dbo.fn_GetMonthFromDate (date_column) öğesini FROM table_name adlı Ay olarak yapabilirsiniz.


/****** Object:  UserDefinedFunction [dbo].[fn_GetMonthFromDate]    Script Date: 11/16/2018 10:26:33 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_GetMonthFromDate] 
(@date datetime)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @monthPart int

SET @monthPart = MONTH(@date) IF @monthPart = 1 BEGIN RETURN 'January' END ELSE IF @monthPart = 2 BEGIN RETURN 'February' END ELSE IF @monthPart = 3 BEGIN RETURN 'March' END ELSE IF @monthPart = 4 BEGIN RETURN 'April' END ELSE IF @monthPart = 5 BEGIN RETURN 'May' END ELSE IF @monthPart = 6 BEGIN RETURN 'June' END ELSE IF @monthPart = 7 BEGIN RETURN 'July' END ELSE IF @monthPart = 8 BEGIN RETURN 'August' END ELSE IF @monthPart = 9 BEGIN RETURN 'September' END ELSE IF @monthPart = 10 BEGIN RETURN 'October' END ELSE IF @monthPart = 11 BEGIN RETURN 'November' END ELSE IF @monthPart = 12 BEGIN RETURN 'December' END RETURN NULL END

0

En kolay yol işlevi çağırmaktır MONTHNAME(your_date). tarihiniz statik bir değer veya tablo alanlarınızdan birindeki değer olabilir.


0

AY ADI SEÇ (concat ('1970 -', [Month int val], '- 01'))

örnek- AYNADI SEÇ (concat ('1970 -', 4, '- 01'))

cevap- Nisan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.