【问题标题】:Separate Datetime column while rounding the time在舍入时间时分隔日期时间列
【发布时间】:2015-04-23 18:02:52
【问题描述】:

我在 SQL Server 中有一个 datetime 列,我需要在四舍五入到 15 分钟间隔时提取时间。

我有时间四舍五入到 15 分钟(最后 15 分钟增量,不是最近的,所以它不会前进)但我需要将时间与字段的日期部分分开。

这是我到目前为止的代码:

CAST(DATEPART(HOUR, MyDate) AS char(2)) + ':' + 
   CAST(DATEPART(MINUTE, MyDate) / (24 * 4) AS CHAR(5)) as Interval2

谁能告诉我如何将时间与列的日期部分分开?

【问题讨论】:

  • 这不正是您使用 DATEPART 所做的吗?
  • 上面的代码给了我当时0:0的结果。例如,它没有给我 00:00 的格式。我找到了给我时间四舍五入但不删除日期格式的代码,我需要删除日期格式:'cast(round(floor(cast(MyDate as float(53))*24*4 )/(24*4),5) as smalldatetime)AS Interval'

标签: sql-server sql-server-2008 tsql datetime


【解决方案1】:

试试这个:

SELECT convert(varchar(8), getdate(), 108) 

这应该只为您提供日期时间列中的时间部分,即小时:分钟:秒。如果您只是想以某种格式获取日期时间/日期字段,那么 Convert() 函数通常是一个不错的方法。

convert() 函数中的 108 以 hh:mm:ss 格式返回日期时间字段。希望这会有所帮助!

更新:

您可以创建一个类似这样的函数,您可以在其中输入日期时间字段并舍入到 0.25(即 15 分钟间隔,即 60 分钟 *0.25 = 15 分钟)。

USE [DatabaseName] --replace with your db name
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[RoundTime] (@Time datetime, @RoundTo float) RETURNS datetime
AS
BEGIN
    DECLARE @RoundedTime smalldatetime, @Multiplier float

    SET @Multiplier = 24.0 / @RoundTo

    SET @RoundedTime= ROUND(CAST(CAST(CONVERT(varchar, @Time, 121) AS datetime) AS float) * @Multiplier, 0) / @Multiplier

    RETURN @RoundedTime
END

然后你可以使用上面这样的函数来获取你的时间:

select convert(varchar(8),dbo.RoundTime(getdate(),0.25),108)

如果上面的语句不适合你,这绝对可以:

SELECT CASE 
        WHEN convert(VARCHAR(8), dbo.RoundTime(getdate(), 0.25), 108) > convert(VARCHAR(8), getdate(), 108)
            THEN convert(VARCHAR(8), DATEADD(minute, - 15, dbo.RoundTime(getdate(), 0.25)), 108)
        ELSE convert(VARCHAR(8), dbo.RoundTime(getdate(), 0.25), 108)
        END new_time

【讨论】:

  • 你能解释一下你的答案吗?
  • 当然,如果您有兴趣了解有关 convert() 函数的更多信息。这将是一个很好的起点:w3schools.com/sql/func_convert.asp
  • 不适合我。您的答案被困在潜在的“低质量问题”的审查队列中。这是因为缺乏解释。解释这个问题总是一件好事,不管它对你自己来说多么微不足道。
  • 感谢 Magnilex,我在回答中添加了更多描述。感谢您的反馈!
  • 虽然这会将日期时间显示为 hh:mm:ss 格式,但它不会将数字四舍五入到我需要做的 15 分钟间隔。
【解决方案2】:

将数据转换为time 数据类型。这是如何工作的快速演示:

DECLARE
  @TestD  datetime
 ,@TestT  time


SET @TestD = getdate()

SET @TestT = @TestD

PRINT @TestD
PRINT @TestT
PRINT '-------------------------'
PRINT CAST(@TestD as Time)

【讨论】:

    【解决方案3】:
    RTRIM(CONVERT(varchar, CAST(ROUND(FLOOR(CAST(MyDate AS float(53)) * 24 * 4) / (24 * 4), 5) AS smalldatetime), 108))
    

    我得到了这段代码,它从日期时间字段中提取时间并将时间四舍五入到我正在寻找的季度间隔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多