获取今天午夜的日期和时间,并将其添加到其中。

38

有没有一条 SQL 命令可以获取今天的午夜时间,并且能够在此基础上加上若干分钟?


你是指距离午夜还有多少分钟? - Dzoki
不,我有一个开始时间和结束时间... 开始时间需要是午夜,结束时间会在n分钟后。 - user867621
如果您知道时间,那么最短的方法可能是: 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' as datetime)) endTime - Manpreet Singh Dhillon
6个回答

56

现在的日期是午夜时间:

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

增加600分钟:

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

叫我疯了,但是 DATEADD(d,0,DATEDIFF(d,0,GETDATE())) 给出的是昨天的开始时间,而不是今天的开始时间。 - tymtam
DATEADD(d,0,DATEDIFF(d,0,GETDATE())) 运行良好,可以得到当前日期的零点时间,例如今天是 2023-05-23 00:00:00.000 - CajunCoding

34

可以,只需使用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(左右)。这是因为,嗯,查看 这个SO答案

编辑:添加示例脚本以展示如何运行:

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

谢谢,很抱歉我没有更好地搜索这个网站。 - user867621
这是否意味着如果我执行以下操作:SET today = GETDATE();SET start = DATEADD(DAY, DATEDIFF(DAY, 0, today), 0);它将被设置为当前日期的午夜?(当然,“午夜”指的是当天的00:00小时) - Alex Watts
是的,除非您的脚本需要一些语法修正......我已经在我的答案中添加了编辑演示。 - Charles Bretana

15
你也可以将其转换为 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强制转换为date并没有起作用,我收到了一个错误,指出“类型date不是定义的系统类型。”- SQL Server 2005 - Peter Perháč
2
@PeterPerháč date 在 SQL Server 2008 中被添加。 - Jeff Ogata
我拿一张包含数千行数据的表格,进行了cast(getdate() as date)dateadd(d, 0, DATEDIFF(d, 0, getdate()))的比较。 结果发现,cast函数比dateadd函数快10倍。 - DarthAyokas

8

死灵术:

最简单/最快的方法是:

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

或者使用协调世界时:

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

这个方法有效的原因是在SQL Server中,datetime是一个浮点值,整数部分代表从1900年1月1日开始算起到现在的天数,子整数部分代表一天中所占比例(24小时)。

所以,如果你将浮点数向下取整(floor)到整数,就可以得到午夜时间。
1900-01-01T00:00:00.000被表示为0。


1
使用上述代码,我得到了 2020-04-03 00:01:00.000。我认为你想要一个零而不是一个一。SELECT DATEADD(minute, 0, CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS datetime)) - David Metcalfe
@David Metcalfe:问题是如何将其加一分钟 - 这个示例演示了使用+1分钟的方法。 - Stefan Steiger

2

请使用以下内容:

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

这样您就可以调整秒数,精确地找到所需的任何时间点。

有关 SQL Server 中日期/时间格式化,请参考以下链接: SQL Server 日期/时间格式化


-1
我曾经需要做类似的事情,创建一个过程从前一天的某个时间运行到当前日期的某个时间。这是我设置开始日期为前一天下午4点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) 

希望这能帮助到某个人。


1
欢迎来到Stack Overflow!请不要在多个问题中发布相同的答案。发表一个好的答案,然后标记/投票关闭其他问题作为重复项。如果问题不是重复的,请根据问题量身定制您的答案。在此处找到重复答案here - Scott Weldon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接