จะรับวันแรกและวันสุดท้ายของปีปัจจุบันได้อย่างไร?


110

การใช้ SQL Server 2000 ฉันจะรับวันแรกและวันสุดท้ายของปีปัจจุบันได้อย่างไร

ผลลัพธ์ที่คาดหวัง:

01/01/2012 และ 31/12/2012

คำตอบ:


237
SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

ข้อความค้นหาข้างต้นให้ค่าวันที่เวลาเที่ยงคืนของวันที่ 31 ธันวาคมซึ่งเป็นช่วงเวลาสุดท้ายของปีที่สั้นกว่า 24 ชั่วโมง หากคุณต้องการรวมเวลาที่อาจเกิดขึ้นในวันที่ 31 ธันวาคมคุณควรเปรียบเทียบกับวันแรกของปีถัดไปด้วยการ<เปรียบเทียบ หรือคุณสามารถเปรียบเทียบกับไม่กี่มิลลิวินาทีสุดท้ายของปีปัจจุบัน แต่สิ่งนี้ยังคงมีช่องว่างหากคุณกำลังใช้อย่างอื่นที่ไม่ใช่ DATETIME (เช่น DATETIME2):

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
   DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear

รายละเอียดทางเทคนิค

สิ่งนี้ทำงานโดยการหาจำนวนปีตั้งแต่ปี 1900 ด้วยDATEDIFF(yy, 0, GETDATE())แล้วบวกกับวันที่เป็นศูนย์ = 1 ม.ค. 1900 สิ่งนี้สามารถเปลี่ยนเป็นการทำงานสำหรับวันที่โดยพลการโดยการแทนที่GETDATE()ส่วนหรือปีโดยพลการโดยแทนที่DATEDIFF(...)ฟังก์ชันด้วย "ปี - 1900"

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015

13

นี่เป็นวิธีที่ค่อนข้างง่าย

SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';

ไม่เซ็กซี่ แต่ก็ใช้ได้


1
ใช้ได้เฉพาะตั้งแต่ Sql Server 2012
Lukas

12

คุณสามารถรับปีปัจจุบันโดยใช้DATEPARTฟังก์ชันจากวันที่ปัจจุบันที่ได้รับโดยใช้getUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))

1
สิ่งนี้ส่งออกสตริงไม่ใช่วันที่ หากนั่นคือสิ่งที่คุณต้องการจริงๆ แต่ถ้าคุณสามารถใช้ได้ให้ใช้วันที่เป็นวันที่และอย่าใช้เป็นสตริง
Jamie F

2
ฉันไม่เห็นด้วย OP ไม่ได้ระบุและชุดข้อมูลที่ตั้งไว้ในเซิร์ฟเวอร์ sql อาจส่งคืนค่าบางอย่างเช่น '2012-01-01 12:13:14' แทน '01 /
01/2012

1
@RandyMorris เห็นด้วย OP กำลังถามว่าเขาสามารถรับDATETIMEแทนสตริงได้หรือไม่และเห็นได้ชัดว่าอาจไม่ตรงกับผลลัพธ์ที่คาดไว้ตามคำถาม
Vikdor

1
เหตุใดคุณจึงใช้รูปแบบวันที่ที่ไม่ชัดเจน (และสตริงในคำตอบของคุณไม่ตรงกับรูปแบบในความคิดเห็นของคุณ) yyyyMMddไม่ชัดเจน
Damien_The_Unbeliever

1
@Damien_The_Unbeliever แบบสอบถามในการตอบกลับจะตรงกับผลลัพธ์ที่คาดหวังตามคำถาม ความคิดเห็นเกี่ยวกับ DATETIME เป็นการตอบกลับความคิดเห็นของ OP เกี่ยวกับการรับวันที่แทนที่จะเป็นสตริง คำตอบไม่ได้สะท้อนถึงการสนทนานี้
Vikdor


4

ทุกปีจะมีวันที่ 1 เป็นวันแรกและวันที่ 31 เป็นวันสุดท้ายสิ่งที่คุณต้องทำคือแนบปีกับวันและเดือนนั้นเท่านั้นเช่น: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
นี้ไม่จำเป็นต้องจริงตามที่มีหลายเท็จโปรแกรมเมอร์เชื่อเกี่ยวกับเวลา
krillgar

ใครช่วยยกตัวอย่างว่าเมื่อไหร่จะไม่ได้ผล?
slayernoah

@slayernoah ขึ้นอยู่กับการตั้งค่าการแปลของเซิร์ฟเวอร์ฉันคิดว่าบางครั้งสิ่งนี้จะทำให้เกิดข้อผิดพลาด
Jamie F

3

ในการรับวันแรกและวันสุดท้ายของปีเราสามารถใช้CONCATฟังก์ชันนี้ได้ ค่าผลลัพธ์อาจถูกโยนเป็นประเภทใดก็ได้

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

ปีใช้ไม่ได้สำหรับฉัน แต่ date_part ทำงาน start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat

1

สำหรับวันที่เริ่มต้นของปีปัจจุบัน:

SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())

สำหรับวันที่สิ้นสุดของปีปัจจุบัน:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))

1

อีกวิธีหนึ่ง: (ตั้งแต่ SQL Server 2012)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay

0

ลองดูสิ่งนี้:

select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
       convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear


0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)

คุณควรอธิบายรหัสของคุณ การทิ้งโค้ดมักจะถูกลดลงและอาจถูกลบ
Bugs

0

ดูเหมือนว่าคุณจะสนใจในการดำเนินการทุกอย่างในปีหนึ่ง ๆ หากเป็นกรณีนี้ฉันขอแนะนำให้ใช้ฟังก์ชันYEAR ()ดังนี้:

SELECT * FROM `table` WHERE YEAR(date_column) = '2012';

เดียวกันจะไปสำหรับวัน ()และเดือน () นอกจากนี้ยังพร้อมใช้งานสำหรับตัวแปร MySQL / MariaDB และได้รับการแนะนำใน SQL Server 2008 (ไม่ใช่สำหรับปี 2000 ที่เฉพาะเจาะจง)


-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual

สำหรับ PL-SQL โพสต์ระบุว่า SQL Server 2000 ดังนั้นคุณต้องใช้ T-SQL To_Date และ Sysdate ไม่มีอยู่ใน T-SQL
Andrew Failor

-1

ใน Microsoft SQL Server (T-SQL) สามารถทำได้ดังนี้

--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

CURRENT_TIMESTAMP - ส่งคืนวันที่เซิร์ฟเวอร์ sql ในเวลาที่ดำเนินการสืบค้น

YEAR - รับส่วนปีของการประทับเวลาปัจจุบัน

STR , LTRIM - ใช้ฟังก์ชันทั้งสองนี้เพื่อให้เราสามารถแปลงสิ่งนี้เป็น varchar ที่สามารถเชื่อมต่อกับคำนำหน้าที่ต้องการของเราได้ (ในกรณีนี้อาจเป็นวันแรกของปีหรือวันสุดท้ายของปี) ไม่ว่าด้วยเหตุผลใดผลลัพธ์ที่สร้างโดยฟังก์ชันYEARจึงมีช่องว่างนำหน้า ในการแก้ไขเราใช้ฟังก์ชันLTRIMซึ่งเป็นส่วนตัดด้านซ้าย


-1

หากถึงวันที่ 1 มกราคมคุณอาจจะยังเป็นวันที่ของปีสุดท้าย

select
convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear

-2

ลองสิ่งนี้:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')

Microsoft SQL Server Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi

คำตอบนี้ใช้ฟังก์ชัน MySQL (และแคสต์วันที่เป็นสตริงซึ่งเป็นหนึ่งในสัตว์เลี้ยงของฉัน)
ÁlvaroGonzález

-3

- การสาธิต Lalmuni -

create table Users
(
userid int,date_of_birth date
)

- ใส่ค่า ---

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