รับเฉพาะเดือนและปีจาก SQL DATE


คำตอบ:


176

เช่นเดียวกับคำแนะนำที่ให้ไปแล้วยังมีอีกหนึ่งความเป็นไปได้ที่ฉันสามารถอนุมานได้จากคำถามของคุณ:
- คุณยังต้องการให้ผลลัพธ์เป็นวันที่
- แต่คุณต้องการ 'ทิ้ง' วันชั่วโมง ฯลฯ
- ออกจากปี / เดือน ช่องวันที่เท่านั้น

SELECT
   DATEADD(MONTH, DATEDIFF(MONTH, 0, <dateField>), 0) AS [year_month_date_field]
FROM
   <your_table>

รับจำนวนเดือนทั้งหมดจากวันที่ฐาน (0) จากนั้นเพิ่มเป็นวันที่ฐานนั้น ดังนั้นจะปัดเศษลงไปที่เดือนที่วันที่นั้นอยู่

หมายเหตุ: ใน SQL Server 2008 คุณจะยังคงแนบ TIME เป็น 00: 00: 00.000 ซึ่งไม่เหมือนกับการ "ลบ" สัญกรณ์ของวันและเวลาโดยสิ้นเชิง นอกจากนี้วันที่ตั้งค่าเป็นวันแรก เช่น 2009-10-01 00: 00: 00.000


3
สิ่งนี้ไม่ได้ผลเลยสำหรับฉัน มันทำให้ฉันได้ผลลัพธ์เป็น 2023-02-01 00: 00: 00.000
Dss

1
@dss - ด้วยพารามิเตอร์อะไร? แสดง SQL จริงและฉันดีใจที่ได้ดู
MatBailie

@MatBailie SELECT DATEADD (MONTH, DATEDIFF (MONTH, 0, LastSaleDate), 0) AS [year_month_date_field] จาก db1.products โดยที่ productID = 123 คอลัมน์ "LastSaleDate" ถูกประกาศเป็น "(datetime, not null)" และฉันได้รับ: 2014-09-01 00: 00: 00.000
Dss

1
@DSS - ใช่ดูเหมือนจะถูกต้อง ซึ่งจะปัดเศษลงไปที่จุดเริ่มต้นของเดือนกันยายน 2014 ไม่มีประเภทข้อมูล "ปีและเดือนเท่านั้น" ดังนั้นการใช้ช่วงเวลาแรกของแต่ละเดือนจึงเป็นแนวทางปฏิบัติมาตรฐาน เมื่อแปลงค่า DATETIME เป็นสตริง (Aaplication Layer, Presentation Layer, Reporting Layer ฯลฯ ) คุณสามารถเลือกจัดรูปแบบได้โดยใช้เพียงส่วนของปีและเดือน แต่ในแง่ของการจัดการข้อมูล "ในฐานข้อมูล" สิ่งนี้ถูกต้อง
MatBailie

ฉันคิดว่าอาจเป็นเพราะคำตอบของคุณควรใช้กับฟิลด์ "วันที่" แต่ฉันใช้ฟิลด์ "วันที่และเวลา" นั่นอาจเป็นปัญหา
Dss

134
select month(dateField), year(dateField)

3
เยี่ยมมาก! คุณสามารถเชื่อมต่อกับคอลัมน์เดียว: 'เลือก cast (เดือน (dateField) เป็น varchar) +' + cast (year (dateField) เป็น varchar) '
izik f


33
SELECT DATEPART(yy, DateVal)
SELECT DATEPART(MM, DateVal)
SELECT DATENAME(MM, DateVal)

2
เลือก DATEPART (MM, DateVal) จะไม่ส่งคืน 'MM' เพียงแค่ส่งคืนหลักเดียวหากเดือนอยู่ระหว่าง 1-9
ใจรัตน์

แทนที่จะเป็น "MM" ควรพูดว่า "month": "SELECT DATEPART (month, getdate ())"
Renne007


15

มีฟังก์ชัน SQL สองอย่างที่ต้องทำ:

โปรดดูเอกสารที่เชื่อมโยงสำหรับรายละเอียด


5
ฉันขอแนะนำให้ใส่ตัวอย่างสั้น ๆ อย่างน้อยเพราะลิงก์ไม่ได้อยู่ตลอดไป ... อันที่จริงลิงก์เหล่านี้ไม่ดีอีกต่อไป
Carol

12

สิ่งนี้จะเป็นประโยชน์เช่นกัน

SELECT YEAR(0), MONTH(0), DAY(0);

หรือ

SELECT YEAR(getdate()), MONTH(getdate()), DAY(getdate());

หรือ

SELECT YEAR(yourDateField), MONTH(yourDateField), DAY(yourDateField);

อย่างไรก็ตามหากไม่ลบ "0" ในช่องส่งคืน?
Si8


10
convert(varchar(7), <date_field>, 120)
because 120 results in 'yyyy-MM-dd' which is varchar(10)
using varchar(7) will display only year and month

example:
select convert(varchar(7), <date_field>, 120), COUNT(*)
from <some_table>
group by convert(varchar(7), <date_field>, 120)
order by 1

6

ฉันกำลังตีความคำถามของคุณสองวิธี

ก) คุณต้องการเพียงเดือนและปีแยกกันซึ่งในกรณีนี้คือคำตอบ

select 
        [YEAR] = YEAR(getdate())
        ,[YEAR] = DATEPART(YY,getdate())
        , [MONTH] = month(getdate())
        ,[MONTH] = DATEPART(mm,getdate())
        ,[MONTH NAME] = DATENAME(mm, getdate()) 

ข)

คุณต้องการแสดงจากวันที่ที่กำหนดให้พูด'2009-11-24 09:01:55.483'ในรูปแบบMONTH.YEAR ดังนั้นผลลัพธ์ควรมา11.2009ในกรณีนี้

หากเป็นเช่นนั้นให้ลองทำเช่นนี้ (ท่ามกลางทางเลือกอื่น ๆ )

select [Month.Year] = STUFF(CONVERT(varchar(10), GETDATE(),104),1,3,'')

5

ฐานข้อมูลบางส่วนเช่นMS ACCESSหรือRODBCอาจไม่รองรับSQL SERVERฟังก์ชัน แต่สำหรับฐานข้อมูลใด ๆ ที่มีFORMATฟังก์ชันคุณสามารถทำได้:

SELECT FORMAT(<your-date-field>,"YYYY-MM") AS year-date FROM <your-table>




2

ลองสิ่งนี้:

โปรตุเกส

SELECT format(dateadd(month, 0, getdate()), 'MMMM', 'pt-pt') + ' ' + convert(varchar(10),year(getdate()),100)

ผลลัพธ์: maio 2019


ภาษาอังกฤษ

SELECT format(dateadd(month, 0, getdate()), 'MMMM', 'en-US') + ' ' + convert(varchar(10),year(getdate()),100)

ผลลัพธ์: พฤษภาคม 2562

หากคุณต้องการเป็นภาษาอื่นให้เปลี่ยน " pt-pt " หรือ " en-US " เป็นภาษาใดก็ได้ในลิงก์



2

เลือก CONCAT (MONTH (GETDATE ()), ".", YEAR (GETDATE ()))

เอาต์พุต: 5.2020

เลือก CONCAT (DATENAME (MONTH, GETDATE ()), ".", YEAR (GETDATE ()))

ผลผลิต: พฤษภาคม 2020


1

ฉันมีข้อกำหนดเฉพาะในการทำสิ่งที่คล้ายกันซึ่งจะแสดงเดือน - ปีซึ่งสามารถทำได้ดังต่อไปนี้:

SELECT DATENAME(month, GETDATE()) + '-' + CAST(YEAR(GETDATE()) AS nvarchar) AS 'Month-Year'

ในกรณีเฉพาะของฉันฉันจำเป็นต้องลดความคลาดเคลื่อนของตัวอักษร 3 เดือนด้วยปี 2 หลักโดยมีลักษณะดังนี้: SELECT LEFT(DATENAME(month, GETDATE()), 3) + '-' + CAST(RIGHT(YEAR(GETDATE()),2) AS nvarchar(2)) AS 'Month-Year'


0

ฐานข้อมูลของฉันไม่รองรับฟังก์ชันส่วนใหญ่ข้างต้น แต่ฉันพบว่ามันใช้งานได้:

SELECT * FROM table WHERE SUBSTR(datetime_column, starting_position, number_of_strings)=required_year_and_month;

ตัวอย่างเช่น: SELECT SUBSTR(created, 1,7) FROM table;

ส่งคืนปีและเดือนในรูปแบบ "yyyy-mm"


0

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

DECLARE @lcMonth nvarchar(10)
DECLARE @lcYear nvarchar(10)

SET @lcYear=(SELECT  DATEPART(YEAR,@Date))
SET @lcMonth=(SELECT  DATEPART(MONTH,@Date))


0

คำถาม: - Select datename(m,GETDATE())+'-'+cast(datepart(yyyy,GETDATE()) as varchar) as FieldName

ผลผลิต: - มกราคม -2562

วันที่ทั่วไปที่เราสามารถใช้ได้

datename(m,<DateField>)+' '+cast(datepart(yyyy,<DateField>) as varchar) as FieldName


0
select convert(varchar(11), transfer_date, 106) 

ทำให้ฉันได้ผลลัพธ์ที่ต้องการของวันที่ในรูปแบบวันที่ 07 Mar 2018

คอลัมน์ของฉัน 'transfer_date' เป็นคอลัมน์ประเภทวันที่และเวลาและฉันใช้ SQL Server 2017 บนสีฟ้า

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