如何从 SQL 服务器中的日期时间戳中的时间部分创建一天的四分之一



我有一个数据集,其中包含一个变量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_timeHOUR,然后使用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_timeHOUR除以 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.

相关内容

  • 没有找到相关文章

最新更新