รับเดือนและปีจากวันที่และเวลาใน SQL Server 2005


87

ฉันต้องการเดือน + ปีจากวันที่และเวลาใน SQL Server เช่น 'ม.ค. 2008' ฉันกำลังจัดกลุ่มคำค้นหาตามเดือนปี ฉันได้ค้นหาและพบฟังก์ชันเช่น datepart, convert เป็นต้น แต่ดูเหมือนจะไม่มีประโยชน์สำหรับสิ่งนี้ ฉันขาดอะไรที่นี่? มีฟังก์ชันนี้หรือไม่?


@Evan Carroll - นี่เป็นการหักหลังคำถามหรือไม่? หากคุณมีคำตอบที่ดีกว่าสำหรับคำถามนี้ไม่ควรให้เป็นคำตอบสำหรับคำถามแทนที่จะชี้ให้ผู้อื่นไปที่คำถามอื่นหรือไม่?
STLDev

@STLDeveloper วิธีการหักหลัง. คำถามเรียกร้องสำหรับปี 2548? ฉันไม่ได้ใส่ตรงนั้น ฉันไม่ได้มองหาปี 2005 .. น่าเสียดายที่คำตอบที่ดีที่สุดที่นี่ใช้ไม่ได้ในปี 2005 แต่เป็นปี 2012 ที่ชัดเจน ฉันควรลงคะแนนคำตอบในปี 2548 ว่าเป็นคนโบราณหรือไม่?
Evan Carroll

@STLD นักพัฒนาจริงๆฉันไม่สนใจที่นี่ =) จุดยืนอย่างเป็นทางการของฉันคือการแนะนำให้ผู้คนใช้ PostgreSQL เสมอไม่แน่ใจว่าทำไมฉันถึงพยายามช่วย
Evan Carroll

ดูเหมือนเป็นเรื่องแปลกสำหรับฉันที่คุณกลับไปสร้างคำถามเวอร์ชันใหม่สำหรับผลิตภัณฑ์เวอร์ชันอื่นจากนั้นจึงตอบคำถามนั้นซึ่งฉันคิดว่าไม่เป็นไร
STLDev

คำตอบ:


75

หากคุณหมายความว่าคุณต้องการให้กลับเป็นสตริงในรูปแบบนั้น

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

นี่คือตัวเลือกรูปแบบอื่น ๆ


ฉันลองใช้ CONVERT (CHAR (4), GetDate (), 100) บน SQL Server ของฉันและฉันได้ "09 1" แทน ฉันได้พื้นที่และหนึ่ง "1" สำหรับวันที่ 17 โดยใช้ "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 16:59 PM"
Nap

1
มันแปลก - จากเอกสารที่ฉันเชื่อมโยง 100 ควรส่งคืนตัวย่อสามตัวอักษรเดือนและเว้นวรรคหากรวมอยู่ใน CHAR (4) แต่ผลลัพธ์ที่คุณโพสต์สำหรับ CONVERT (varchar, getdate (), 100) ดูแตกต่างจากที่ฉันคาดหวัง คุณกำลังใช้ SQLServer เวอร์ชันใด คุณใช้การตั้งค่าโลคัลไลเซชัน / สากลใด (ไม่ใช่ว่าควรมีความสำคัญกับรูปแบบ 100)
robsoft

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

ดังนั้นฉันคิดว่านี่คือสิ่งที่ฉันต้องการ แต่ฉันไม่เห็นว่า TSQL จะเข้าใจความแตกต่างระหว่างdatepart(month,getdate())และdatepart(year,getdate()). อะไรคือเดือนและปี ?
jp2code

4
@ jp2code เดือนและปีที่มีพื้นค่าคงที่ที่กำหนดไว้ที่นี่: msdn.microsoft.com/en-us/library/ms174420.aspx TSQL เข้าใจพวกเขาในแบบเดียวกับที่คุณอ่าน :)
Zachary Yates

1
ฮ่า ๆ - ขอบคุณซัค ฉันติดดาวมานานแล้วก่อนที่จะพบมันในเว็บไซต์อื่น
jp2code

สะอาดกว่าฟังก์ชั่นการแปลงมาก #cleanCode
RBT

52

เริ่มต้นด้วย SQL Server 2012 คุณสามารถใช้:

SELECT FORMAT(@date, 'yyyyMM')

1
เล่นดีครับ ... สิ่งนี้ตอบคำถามของฉันในปี 2012
Squ1rr3lz

ฉันดีใจที่เลื่อนมาไกลขนาดนี้เรียบร้อยและเรียบง่าย ขอบคุณ!
Niklas

นี่เป็นผลงานที่มีค่า แต่ควรได้รับคำตอบจากที่อื่นstackoverflow.com/a/43196370/124486
Evan Carroll


11

ตลกดีฉันแค่เล่นกับการเขียนแบบสอบถามเดียวกันนี้ใน SQL Server แล้วก็ 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

มันสร้าง ouput ต่อไปนี้ (ตัวอย่าง)

Month | Year | Total

January | 2009 | 2




5

ไม่มีรูปแบบนั้น คุณต้องทำสองสิ่งร่วมกัน

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

4

วิธีที่ดีที่สุดคือ:

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

มันจะคงประเภทวันที่และเวลาของคุณไว้


1
นี่เป็นคำตอบที่ดีที่สุดสำหรับการบังคับให้วันใด ๆ เป็นเพียงเดือนและปีโดยไม่สนใจส่วนประกอบของวันและเวลา ดีกว่าคำตอบที่ยอมรับมากเนื่องจากข้อมูลสามารถจัดเรียงได้อย่างถูกต้องและทำงานได้อย่างถูกต้องเป็นวันที่ในเครื่องมือการรายงานแบบดาวน์สตรีม
Jamie Thomas

ฉันยอมรับด้วยใจจริงว่านี่เป็นวิธีที่ดีที่สุดในการเริ่มต้นเดือน โดยจะเก็บข้อมูลประเภทวันที่และเวลาและปล่อยการเรนเดอร์ไว้ที่ส่วนหน้าในตำแหน่งที่ควรจะเป็น นี่เป็นวิธีที่ถูกต้องในการทำสิ่งต่างๆเช่นแถวกลุ่มตามเดือนของเขตข้อมูล
Jeff Breadner

2

ส่งคืนชื่อเต็มเดือน - ปีเต็มเช่น March-2017

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

2
มีคำตอบอื่น ๆ อีก 18 ข้อสำหรับคำถามนี้ คำตอบของคุณเพิ่มข้อมูลใหม่อะไร
stannius


1

การแปลงวันที่เป็นวันแรกของเดือนทำให้คุณสามารถจัดกลุ่มตามและเรียงลำดับตามแอตทริบิวต์เดียวได้และเร็วกว่าในประสบการณ์ของฉัน

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





0

มันใช้งานได้ดี

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

ต่อไปนี้ทำงานได้อย่างสมบูรณ์แบบ! เพิ่งเคยใช้เลยลองดู

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

2
นี่ไม่ใช่ฟังก์ชันหรือคำสั่งเซิร์ฟเวอร์ sql ที่ถูกต้อง
franko_camron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.