首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SQL SERVER中的日期时间戳中从时间部分创建四分之一天

如何从SQL SERVER中的日期时间戳中从时间部分创建四分之一天
EN

Stack Overflow用户
提问于 2019-10-18 09:18:44
回答 3查看 965关注 0票数 0

我有一个数据集,它包含一个变量start_time,它是一个DateTimeStamp变量,包含以下值:

代码语言:javascript
复制
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到05:59:59;第2季度从06:00开始,结束时间是11:59:59;第三季度是从12:00结束,17:59:59;第四季度是从18: 00:00 :00 :11:59:59:59开始)。因此,结果将是:

代码语言:javascript
复制
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

我能够从上述数据中提取时间部分:

代码语言:javascript
复制
 SELECT convert(char(8), start_time, 108) [time] from MyTable;

但不知道怎么进宿舍。有人能帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-18 09:25:52

注意:下面是MySQL (不正确的问题标记)的说明-- Server解决方案将进一步深入这个答案

您可以通过获取HOURstart_time,然后使用CASE语句来实现这一点:

代码语言:javascript
复制
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

产出:

代码语言:javascript
复制
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

或者,您可以使用简单的数学来实现相同的目标:

代码语言:javascript
复制
SELECT start_time,
       CONCAT('Q', FLOOR(HOUR(start_time) / 6 + 1)) AS `time`
  FROM  MyTable

这只是将HOURstart_time除以6,添加1(所以您没有得到Q0),并使用FLOOR将其降到最接近的整数。

MySQL琴

关于关系数据库标签错误的讨论后的编辑

在意识到您实际上使用的是Server而不是MySQL之后,可以在Server中找到以下实现相同功能的方法:

代码语言:javascript
复制
SELECT start_time,
       CONCAT('Q', FLOOR(DATEPART(HOUR, start_time) / 6 + 1)) AS [time]
  FROM  MyTable

输出:

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2019-10-18 09:28:29

你可以用它得到一个1和4之间的数字:

代码语言:javascript
复制
(extract(Hour from start_time) / 6) + 1

编辑:

提取时间对于Server是不同的

代码语言:javascript
复制
datepart(hour, Start_Time)/6+1
票数 1
EN

Stack Overflow用户

发布于 2019-10-18 09:38:08

我能够获得我希望从Server 12输出的方式:

代码语言:javascript
复制
-- 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()作为错误返回时,我无法使用其他两个答案:

代码语言:javascript
复制
Msg 195, Level 15, State 10, Line 36
 'HOUR' is not a recognized built-in function name.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58447749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档