我有一个数据集,其中包含一个变量start_time这是一个DateTimeStamp
变量,包含以下值:
Start_Time
2019-06-19 02:10:52.563
2019-07-24 02:00:05.037
2019-07-31 07:24:44.187
2019-08-11 16:52:24.343
我想做的是将这些时间戳中的每一个转换为一天的四分之一(即一天中有 4 个季度由 6 小时组成,例如第一季度从 hh:mm:ss 开始为 00:00:00 到 05:59:59,第 2 季度从 06:00:00 开始,在 11:59:59 结束,第 3 季度从 12:00:00 开始,在 17:59:59结束,第 4 季度从 18:00:00 到 11:59:59 开始(。所以结果将如下所示:
Start_Time Quarter
2019-06-19 02:10:52.563 Q1
2019-07-24 02:00:05.037 Q1
2019-07-31 07:24:44.187 Q2
2019-08-11 16:52:24.343 Q3
..... and so forth
我能够从上述数据中提取时间部分:
SELECT convert(char(8), start_time, 108) [time] from MyTable;
但不知道如何进入宿舍。有人可以帮忙吗?
请注意,以下是针对MySQL(不正确的问题标签( - SQL Server解决方案在此答案的进一步
您可以通过获取start_time
的HOUR
,然后使用CASE
语句来实现此目的:
SELECT start_time,
CASE
WHEN start_hour < 6 THEN 'Q1'
WHEN start_hour < 12 THEN 'Q2'
WHEN start_hour < 18 THEN 'Q3'
ELSE 'Q4'
END AS `time`
FROM (
SELECT start_time,
HOUR(start_time) AS start_hour
FROM MyTable
) a
输出:
start_time time
2019-06-19T02:10:53Z Q1
2019-07-24T02:00:05Z Q1
2019-07-31T07:24:44Z Q2
2019-08-11T16:52:24Z Q3
或者,您可以使用简单的数学运算来实现相同的目的:
SELECT start_time,
CONCAT('Q', FLOOR(HOUR(start_time) / 6 + 1)) AS `time`
FROM MyTable
这只是将start_time
的HOUR
除以 6,加 1(这样你就不会得到Q0
(,并使用FLOOR
将其降低到最接近的整数。
MySQL sqlfiddle
编辑以下关于RDBMS标签不正确的讨论
在意识到您实际上使用的是SQL Server而不是MySQL之后,请找到以下内容,以便在SQL Server中实现相同的目标:
SELECT start_time,
CONCAT('Q', FLOOR(DATEPART(HOUR, start_time) / 6 + 1)) AS [time]
FROM MyTable
输出:
start_time time
2019-06-19T02:10:53Z Q1
2019-07-24T02:00:05Z Q1
2019-07-31T07:24:44Z Q2
2019-08-11T16:52:24Z Q3
SQL Server sqlfiddle
您可以使用它来获取 1 到 4 之间的数字:
(extract(Hour from start_time) / 6) + 1
编辑:
提取小时对于 SQL Server 是不同的
datepart(hour, Start_Time)/6+1
我能够获得我想要的SQL Server 12输出方式:
-- Converting the date into quarters
select a.*,
CASE
WHEN a.STime BETWEEN '00:00:00' AND '05:59:59' THEN 'Q1'
WHEN a.STime BETWEEN '06:00:00' AND '11:59:59' THEN 'Q2'
WHEN a.STime BETWEEN '12:00:00' AND '17:59:59' THEN 'Q3'
ELSE 'Q4'
END AS QuarterOfTheDay
FROM (SELECT convert(char(8), start_time, 108) as STime from MyTable) a;
我无法使用其他两个答案,因为 HOUR(( 作为错误返回:
Msg 195, Level 15, State 10, Line 36
'HOUR' is not a recognized built-in function name.