DATEADD MINUTES 之间的范围 MSSQL
DATEADD MINUTES Between Range MSSQL
我在尝试弄清楚一些事情时遇到了一些困难,假设我有一个日期和时间;
我想再增加 180 分钟;
SELECT DATEADD(MINUTE,180,'2018-05-24 15:00')
这会给我“2018-05-24 18:00”的答案,但我想在一个范围内做,所以如果你在 09:00 - [=22= 之间,请添加分钟] 所以像这样;
SELECT DATEADD(MINUTES,180,'2018-05-24 15:00') WHERE '2018-05-24 15:00' BETWEEN '2018-05-24 09:00' AND '2018-05-24 17:00'
所以答案是“2018-05-25 10:00”
这看起来不是特别漂亮,但是...
USE Sandbox;
GO
CREATE TABLE Times (DateNTime datetime2(0));
INSERT INTO Times
VALUES ('20180520 10:00:00'),
('20180520 15:20:00'),
('20180521 09:32:00'),
('20180521 14:17:00'),
('20180522 16:54:00'),
('20180523 12:46:00'),
('20180524 15:32:00');
GO
SELECT *
FROM Times;
GO
SELECT T.DateNTime,
CASE WHEN CONVERT(time,T.DateNTime) <= '14:00' THEN DATEADD(MINUTE, 180,T.DateNTime)
ELSE DATEADD(MINUTE, 180 - DATEDIFF(MINUTE,T.DateNTime,DATEADD(HOUR,17,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime),0))), DATEADD(HOUR,9,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime) + 1,0))) END
FROM Times T;
GO
DROP TABLE Times;
你可以试试这个:
DECLARE @input DATETIME='2018-05-24 15:00'
DECLARE @min INT=180
SELECT CASE WHEN DATEADD(MINUTE,@min,@input)>DATEADD(HOUR, 17,DateAdd(Day, Datediff(Day,0, @input), 0))
THEN DATEADD(MINUTE,
DATEDIFF(MINUTE,
DATEADD(HOUR, 17,
DATEADD(Day,
DATEDIFF(Day,0, @input),
0)
),
DATEADD(MINUTE,@min,@input)),
DATEADD(Hour,9,
DATEADD(Day,1,
DateAdd(Day,
Datediff(Day,0, @input),
0)
)
)
)
ELSE DATEADD(MINUTE,@min,@input)
END
很难,但这应该适用于您的所有情况。此解决方案适用于任意数量的(正)分钟,结果将始终在参数化小时内,加上相应的天数。
DECLARE @RangeHourStart INT = 9
DECLARE @RangeHourEnd INT = 17
DECLARE @MinutesToAdd INT = 120
DECLARE @Date DATETIME = '2018-05-24 15:00'
SELECT
FinalDate = CASE
WHEN -- When final hour exceeds the range hour
DATEPART(HOUR, @Date) * 60 +
DATEPART(MINUTE, @Date) +
@MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60) > @RangeHourEnd * 60
THEN
DATEADD(HOUR, -1 * (@RangeHourStart - 1),
DATEADD(DAY, 1,
DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60),
DATEADD(
DAY,
@MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
@Date))))
ELSE
DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60),
DATEADD(
DAY,
@MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
@Date))
END
我做到了,所以你不需要硬编码任何值。
我在尝试弄清楚一些事情时遇到了一些困难,假设我有一个日期和时间;
我想再增加 180 分钟;
SELECT DATEADD(MINUTE,180,'2018-05-24 15:00')
这会给我“2018-05-24 18:00”的答案,但我想在一个范围内做,所以如果你在 09:00 - [=22= 之间,请添加分钟] 所以像这样;
SELECT DATEADD(MINUTES,180,'2018-05-24 15:00') WHERE '2018-05-24 15:00' BETWEEN '2018-05-24 09:00' AND '2018-05-24 17:00'
所以答案是“2018-05-25 10:00”
这看起来不是特别漂亮,但是...
USE Sandbox;
GO
CREATE TABLE Times (DateNTime datetime2(0));
INSERT INTO Times
VALUES ('20180520 10:00:00'),
('20180520 15:20:00'),
('20180521 09:32:00'),
('20180521 14:17:00'),
('20180522 16:54:00'),
('20180523 12:46:00'),
('20180524 15:32:00');
GO
SELECT *
FROM Times;
GO
SELECT T.DateNTime,
CASE WHEN CONVERT(time,T.DateNTime) <= '14:00' THEN DATEADD(MINUTE, 180,T.DateNTime)
ELSE DATEADD(MINUTE, 180 - DATEDIFF(MINUTE,T.DateNTime,DATEADD(HOUR,17,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime),0))), DATEADD(HOUR,9,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime) + 1,0))) END
FROM Times T;
GO
DROP TABLE Times;
你可以试试这个:
DECLARE @input DATETIME='2018-05-24 15:00'
DECLARE @min INT=180
SELECT CASE WHEN DATEADD(MINUTE,@min,@input)>DATEADD(HOUR, 17,DateAdd(Day, Datediff(Day,0, @input), 0))
THEN DATEADD(MINUTE,
DATEDIFF(MINUTE,
DATEADD(HOUR, 17,
DATEADD(Day,
DATEDIFF(Day,0, @input),
0)
),
DATEADD(MINUTE,@min,@input)),
DATEADD(Hour,9,
DATEADD(Day,1,
DateAdd(Day,
Datediff(Day,0, @input),
0)
)
)
)
ELSE DATEADD(MINUTE,@min,@input)
END
很难,但这应该适用于您的所有情况。此解决方案适用于任意数量的(正)分钟,结果将始终在参数化小时内,加上相应的天数。
DECLARE @RangeHourStart INT = 9
DECLARE @RangeHourEnd INT = 17
DECLARE @MinutesToAdd INT = 120
DECLARE @Date DATETIME = '2018-05-24 15:00'
SELECT
FinalDate = CASE
WHEN -- When final hour exceeds the range hour
DATEPART(HOUR, @Date) * 60 +
DATEPART(MINUTE, @Date) +
@MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60) > @RangeHourEnd * 60
THEN
DATEADD(HOUR, -1 * (@RangeHourStart - 1),
DATEADD(DAY, 1,
DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60),
DATEADD(
DAY,
@MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
@Date))))
ELSE
DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60),
DATEADD(
DAY,
@MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
@Date))
END
我做到了,所以你不需要硬编码任何值。