SQL Server 2005'te bir tarih saatinden ay ve yılı alın


87

SQL Server'da 'Ocak 2008' gibi tarih saatinden ay + yıla ihtiyacım var. Sorguyu aya, yıla göre gruplandırıyorum. Datepart, convert vb. Gibi işlevleri araştırdım ve buldum, ancak hiçbiri bunun için yararlı görünmüyor. Burada bir şey mi kaçırıyorum? Bunun için bir işlev var mı?


@Evan Carroll - bu sorunun ele geçirilmesi anlamına mı geliyor? Soruya daha üstün bir cevabınız varsa, insanları farklı bir soruya yönlendirmek yerine soruya cevap olarak verilmemeli mi?
STLDev

@STLDeveloper nasıl ele geçiriliyor. Soru 2005'i mi çağırıyor? Onu oraya ben koymadım. 2005'i aramıyorum .. Ne yazık ki, buradaki en iyi cevap 2005'te işe yaramıyor, 2012'de açık. Arkaik olduğu için 2005 yanıtlarını geri mi vermeliyim?
Evan Carroll

@STLDeveloper aslında, burası umrumda değil. =) resmi duruşum her zaman insanlara PostgreSQL kullanmalarını tavsiye etmek oldu, neden yardım etmeye çalıştığımdan emin değilim.
Evan Carroll

Ürünün farklı bir versiyonu için sorunun yeni bir versiyonunu oluşturmak için geri dönmeniz ve daha sonra bu soruyu cevaplamanız bana garip geldi, sanırım sorun değil.
STLDev

Yanıtlar:


75

Onları bir dizge olarak bu biçimde geri istediğinizi kastediyorsanız;

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

İşte diğer biçim seçenekleri


SQL Server'ımda CONVERT (CHAR (4), GetDate (), 100) kullanmayı denedim ve onun yerine "09 1" aldım. Boşluğu ve 17 için bir "1" i "seçin CONVERT (varchar, GetDate (), 100)" verim "09 17 2009 4:59 PM"
Nap

1
Bu garip - bağlantı verdiğim dokümanlardan 100, üç harfli bir ay kısaltması ve bir CHAR (4) içine yerleştirilmişse bir boşluk döndürmelidir. Ancak bir CONVERT (varchar, getdate (), 100) için gönderdiğiniz sonuç görmeyi beklediğimden farklı görünüyor. Hangi SQLServer sürümünü kullanıyorsunuz? Hangi yerelleştirme / uluslararasılaştırma ayarlarını kullanıyorsunuz (bunun 100 formatı için önemli olması gerekmez).
robsoft

171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)

Bu yüzden, istediğim şeyin bu olduğunu düşünüyorum, ancak TSQL'in datepart(month,getdate())ve arasındaki farkı nasıl anlayacağını anlamıyorum datepart(year,getdate()). Nelerdir ay ve yıl ?
jp2code

4
@ jp2code ay ve yıl temelde burada tanımlanan sabitlerdir: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL, onları okuyarak sizin anladığınız gibi anlar :)
Zachary Yates

1
LOL - Teşekkürler Zach. Bunu farklı bir sitede anlamadan önce uzun bir süre başladım.
jp2code

Dönüştürme işlevinden çok daha temiz. #cleanCode
RBT


12

Kullanım:

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

11

Komik, ben de aynı sorguyu SQL Server'da ve ardından LINQ'da yazarak oynuyordum.

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

Aşağıdaki çıktıyı üretir (örnek).

Month | Year | Total

January | 2009 | 2

9

SQL server 2012'de aşağıdaki kullanılabilir

BİÇİM seçin (getdate (), 'MMM yyyy')

Bu tam olarak "Haziran 2016" değerini verir


6

Buna ne dersin?

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


5

Bu format mevcut değil. İki şeyin bir kombinasyonunu yapmanız gerekiyor,

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

4

bunu yapmanın en iyi yolu şudur:

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

tarih-saat tipinizi koruyacak


1
Bu, gün ve saat bileşenlerini göz ardı ederek, herhangi bir tarihi yalnızca ay ve yıl olmaya zorlamak için en iyi cevaptır. Kabul edilen cevaptan çok daha iyi çünkü bilgiler doğru sıralanabilir ve aşağı akış raporlama araçlarında bir tarih olarak doğru bir şekilde işlev görür.
Jamie Thomas

Ayın başına gelmenin en iyi yolunun bu olduğuna yürekten katılıyorum. Veri türü tarih saatini tutar ve işlemeyi olması gerektiği yerde ön uca bırakır. Bu, bir alanın ayına göre grup satırları gibi şeyler yapmanın doğru yoludur.
Jeff Breadner

2

tam ay adını, -, tam yıl, örn. March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))

2
Bu soruya zaten 18 başka cevap var. Cevabınız hangi yeni bilgileri katıyor?
stannius

1

Aynı sorunu yaşadım ve etrafa baktıktan sonra şunu buldum:

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

Harika çalışıyor!


1

Tarihi ayın ilkine dönüştürmek, tek bir öznitelikle Gruplama ve Sıralama yapmanıza olanak tanır ve bu benim deneyimime göre daha hızlıdır.

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

Soru SQL Server 2005 ile ilgili, buradaki cevapların çoğu daha sonraki sürüm SQL Server içindir.

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

SQL Server 2005, SQL Server 2008'de tanıtılan tarih işlevine sahip değildir


0

Evet, datename(month,intime)ayı metin olarak almak için kullanabilirsiniz .


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

Cevap: MONTH_ Ocak Ocak Eylül Ekim Aralık Ekim Eylül


0

Harika çalışıyor.

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

Aşağıdakiler mükemmel çalışıyor! Sadece kullandım, dene.

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

2
bu geçerli bir sql sunucu işlevi veya ifadesi değil
franko_camron
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.