首页 > 解决方案 > 如何从 SQL SERVER 中的日期时间戳的时间部分创建一天的四分之一

问题描述

我有一个数据集,其中包含一个变量 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;

但不知道如何进入宿舍。有人可以帮忙吗?

标签: sqlsql-server

解决方案


请注意以下是针对 MySQL 的(不正确的问题标签)- SQL Server 解决方案在此答案的下方

您可以通过获取 theHOURstart_time然后使用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

这只是将 的 除以HOUR6 start_time,加 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


推荐阅读