เวลาวันที่ T-SQL ปัดเศษเป็นนาทีที่ใกล้ที่สุดและชั่วโมงที่ใกล้ที่สุดโดยใช้ฟังก์ชัน


113

ใน SQL server 2008 ฉันต้องการให้คอลัมน์วันที่และเวลาปัดเศษเป็นชั่วโมงที่ใกล้ที่สุดและนาทีที่ใกล้ที่สุดโดยเฉพาะอย่างยิ่งกับฟังก์ชันที่มีอยู่ในปี 2008

สำหรับค่าคอลัมน์นี้2007-09-22 15:07:38.850ผลลัพธ์จะมีลักษณะดังนี้:

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour

6
ตัวอย่างนาทีที่ใกล้ที่สุดควรเป็น 15:08 ไม่ใช่หรือ เพราะวินาทีในหนึ่งนาทีคือ 60 ...
OMG Ponies

คุณตั้งใจไม่แก้ไขข้อผิดพลาดนั้นเมื่อคุณแก้ไขคำถามของเขาเพื่อให้แสดงความคิดเห็นนั้นหรือไม่?
นายพุธ

@MrWed Wednesday คุณทราบดีว่ามีเวลามากกว่า 10 นาทีระหว่างการแก้ไขและความคิดเห็นนั้น ฉันคิดว่าความคิดเกิดขึ้นหลังจากนั้น
lc.

คำตอบ:


208
declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

จะกลับมา

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

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

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

และคุณจะได้รับ:

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

ก่อนที่วันที่ชนิดข้อมูลที่ถูกบันทึกใน SQL Server 2008 ผมจะใช้วิธีการดังกล่าวจะตัดส่วนเวลาจากวันที่และเวลาที่จะได้รับเพียงวัน แนวคิดคือการกำหนดจำนวนวันระหว่างวันที่และเวลาที่เป็นปัญหากับจุดที่กำหนดในเวลา ( 0ซึ่งโดยปริยายหมายถึง1900-01-01 00:00:00.000):

declare @days int
set @days = datediff(day, 0, @dt)

จากนั้นเพิ่มจำนวนวันดังกล่าวลงในจุดเวลาที่กำหนดซึ่งจะให้วันที่เดิมแก่คุณพร้อมเวลาที่ตั้งไว้เป็น00:00:00.000:

select dateadd(day, @days, 0)

หรือสั้นกว่านั้น:

select dateadd(day, datediff(day, 0, @dt), 0)

ใช้ DatePart ที่แตกต่างกัน (เช่นhour, mi) จะทำงานตาม


2
ฉันสงสัยว่าจะมีใครเจอเรื่องนี้ แต่ถ้าคุณพยายามปัดขึ้นเป็นวินาทีที่ใกล้ที่สุดและเพิ่ม 500 มิลลิวินาทีคุณจะต้องทำวันที่ (วินาที, '1/1/2000', .... เทียบกับวันที่ (วินาที, 0 .... เนื่องจากคุณจะได้รับข้อผิดพลาดล้นวินาทีจาก 0 นั้นใหญ่เกินไปฉันเดา
Eric Twilegar

'เพิ่มจำนวนชั่วโมงตั้งแต่ 1 มกราคม 1900 ถึง 1 มกราคม 1900' - ฉันพบสิ่งนี้ใน Java / SQL ซึ่งมันดูน่าเกลียด ในกรณีของฉันมันควรจะทำในฝั่ง Java จริงๆ
Corwin Newall

สำหรับการคำนวณด้วยdatetimeoffsetฉันต้องแทนที่0ด้วยTODATETIMEOFFSET('1900-01-01 00:00:00', 0)เพื่อหลีกเลี่ยงการบังคับให้โซนเวลาท้องถิ่นเข้าสู่ผลลัพธ์
krlmlr

26

"ปัดเศษ" ลงตามตัวอย่างของคุณ สิ่งนี้จะส่งคืนค่า varchar ของวันที่

DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'

SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15

แปลง varchar กลับเป็นวันที่และเวลาสามารถทำได้ (เป็นชั่วโมง):CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
Decula

10

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

CAST(YourValueHere as smalldatetime);

สำหรับชั่วโมงหรือวินาทีให้ใช้คำตอบของ Jeff Ogata (คำตอบที่ยอมรับ) ด้านบน


1
คำตอบที่ยอดเยี่ยมฉันได้ตรวจสอบแล้วว่ามันกลมและไม่เพียงแค่ตัดทอน สำหรับใครก็ตามที่กำลังมองหาตัวเลือกนี้smalldatetimeถูกเพิ่มใน SQL 2008
BradC

นี่เป็นตัวเลือกที่ดีที่สุดหากคุณต้องการแก้ไขข้อมูลบางอย่างในตารางของคุณที่ต้องใช้เวลาเพียงนาทีเดียว
เข้ารหัส

-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

จะปัดเศษลงเป็นวินาทีถึง 00


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