【问题标题】:get the date and time for today at midnight and add to it在午夜获取今天的日期和时间并添加到它
【发布时间】:2011-12-03 18:05:09
【问题描述】:

是否有 sql 命令可以在午夜获取今天的日期并能够添加分钟数?

【问题讨论】:

  • 你的意思是离午夜还有多少分钟?
  • 不,我必须 start_time 和一个 finish_time...开始时间需要是午夜,而 finish_time 应该是 n 分钟后
  • 如果你知道时间,那么最短的方法可能是:select cast(convert(varchar,getdate(),23) + '23:59:59' as datetime) 你可以得到开始和结束日期如下: select cast(convert(varchar,getdate(),23) + ' 23:59:59' as datetime) startTime, dateadd(minute,10,cast(convert(varchar,getdate(),23) + ' 23:59:59' 作为日期时间))结束时间

标签: sql sql-server sql-server-2008


【解决方案1】:

现在日期午夜时间:

Select DATEADD(d,0,DATEDIFF(d,0,GETDATE()))

增加 600 分钟:

Select DATEADD(mi,600,DATEDIFF(d,0,GETDATE()))

【讨论】:

    【解决方案2】:

    是的,只需使用 datediff 和 dateadd 函数从任何日期删除时间,然后将一天的小数部分添加到该数字

    Declare @aDate DateTime
    Set @aDate = getDate()
    Declare @Minutes Integer
    Set @minutes = 600 -- 10 hours
    
    Select DateAdd(day, DateDiff(day, 0, @aDate), 0) + @minutes / 1440.0  -- 1440 min/day
     -- or You could also use the dateadd again...
    Select DateAdd(minute, @minutes , DateAdd(day, DateDiff(day, 0, @aDate), 0))
    

    两个选择都在同一天上午 10:00 返回(或多或少)。这是因为,好吧,看看this SO answer

    编辑:添加示例脚本以显示其工作原理:

    declare @dtTim datetime = getDate()
    declare @today datetime = dateAdd(day, dateDiff(day, 0, @dtTim ), 0)
    select  @dtTim, @today
    

    【讨论】:

    • 谢谢.. 对不起,我没有更好地搜索该网站
    • 这是否意味着如果我这样做: SET today = GETDATE(); SET 开始 = DATEADD(DAY, DATEDIFF(DAY, 0, 今天), 0);它将被设置为当天的午夜? (不能在 cmets 中使用多个“@”符号)(“午夜”当然是指一天中的 00:00 小时)
    • 是的,除了你的脚本需要一些语法更正.....在我对演示的回答中添加了编辑
    【解决方案3】:

    您也可以转换为date 以去除时间部分:

    declare @minutes int = 600
    declare @start datetime = cast(getdate() as date)
    declare @finish datetime = dateadd(mi, @minutes, @start)
    

    虽然,老实说,我不知道它的表现如何与

    dateadd(day, datediff(day, 0, getdate()), 0)

    【讨论】:

    • 对我来说,将 getdate 转换为日期不起作用,我收到一个错误,抱怨“类型日期不是定义的系统类型”。 - sql server 2005
    • @PeterPerháč date 已添加到 SQL Server 2008 中。
    • 我将cast(getdate() as date)dateadd(d, 0, DATEDIFF(d, 0, getdate())) 与一个几千行的表进行了比较。 演员比 dateadd 快 10 倍...
    【解决方案4】:

    死灵法:

    最简单/最快的方法是:

    SELECT 
        DATEADD(minute, 1, 
            CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS datetime)   
        )
    

    或使用 UTC:

    SELECT 
        DATEADD(minute, 1, 
            CAST(FLOOR(CAST( GETUTCDATE() AS float)) AS datetime)   
        )
    

    这是可行的,因为在 SQL-server 中,datetime 是一个浮点值,整数部分表示从 01.01.1900 开始的天数,子整数部分表示全天(24 小时)的百分比。

    因此,如果您将 (floor) 浮点数向下舍入为整数,您将得到午夜时间。
    1900-01-01T00:00:00.000 为 0。

    【讨论】:

    • 使用上面的,我得到2020-04-03 00:01:00.000。我相信你想要一个 0 而不是 1。SELECT DATEADD(minute, 0, CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS datetime))
    【解决方案5】:

    使用以下:

    select DATEADD(SECOND, 36000, CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS datetime))
    

    通过这种方式,您可以调整秒数以精确定位您想要的一天中的任何时间。

    有关 SQL Server 中的日期/时间格式,请参阅此内容: SQL Server Date/Time Formatting

    【讨论】:

      【解决方案6】:

      我不得不做类似的事情,创建一个程序从前一天的某个时间运行到当天的某个时间这是我所做的,将开始日期设置为前一天的 16:30,基本上减去你不想让它们回到 0 的部分,然后加上你想要的值。

      -- Set Start Date to previous day and set start time to 16:30.00.000
      
      SET @StartDate = GetDate()
      SET @StartDate = DateAdd(dd,- 1, @StartDate) 
      SET @StartDate = DateAdd(hh,- (DatePart(hh,@StartDate))+16, @StartDate) 
      SET @StartDate = DateAdd(mi,- (DatePart(mi,@StartDate))+30, @StartDate) 
      SET @StartDate = DateAdd(ss,- (DatePart(ss,@StartDate)), @StartDate) 
      SET @StartDate = DateAdd(ms,- (DatePart(ms,@StartDate)), @StartDate) 
      

      希望这对某人有所帮助。

      【讨论】:

      • 欢迎来到 Stack Overflow!请不要对多个问题发布相同的答案。发布一个好的答案,然后标记/投票以关闭其他问题作为重复问题。如果问题不是重复的,调整你对问题的回答。找到重复的答案here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多