sql - 日夜段中按日期划分的 SQL 数据
问题描述
我们需要在 Day and Night Segments 中获取 2 天的数据(分段时间由客户定义)。假设如果客户说从 2019 年 10 月 25 日上午 8 点开始,这意味着我们需要获取这些日期的数据。
10/25/2019 8AM - 10/25/2019 8PM (Day DateTime)
10/25/2019 8PM - 10/26/2019 8AM (Night DateTime)
10/26/2019 8AM - 10/26/2019 8PM (Day DateTime)
10/26/2019 8PM - 10/27/2019 8AM (Night DateTime)
现在,我们将这些日期作为 XML 传递给存储过程,现在我的问题是遍历每个日期行并按列(日期、日、夜)检索数据的最佳方法是什么?我曾想过实现一个游标,但有更好的方法吗?
解决方案
我使用以下查询为您创建示例数据
SELECT X,Y
FROM
(
VALUES
('10/25/2019 8AM','10/25/2019 8PM'),
('10/25/2019 8PM','10/26/2019 8AM'),
('10/26/2019 8AM','10/26/2019 8PM'),
('10/26/2019 8PM','10/27/2019 8AM')
) AS F(X , Y)
及其此查询的输出
X Y
-------------- --------------
10/25/2019 8AM 10/25/2019 8PM
10/25/2019 8PM 10/26/2019 8AM
10/26/2019 8AM 10/26/2019 8PM
10/26/2019 8PM 10/27/2019 8AM
并在您的数据上编写此代码
SELECT *,
CONVERT(DATE,X) AS 'Date' ,
'DAY & NIGHT' = CASE WHEN DATEPART(HOUR,CONVERT(DATETIME,X)) < 12 THEN 'AM'
ELSE 'PM' END
FROM
(
SELECT X,Y
FROM
(
VALUES
('10/25/2019 8AM','10/25/2019 8PM'),
('10/25/2019 8PM','10/26/2019 8AM'),
('10/26/2019 8AM','10/26/2019 8PM'),
('10/26/2019 8PM','10/27/2019 8AM')
) AS F(X , Y)
) AS T
及其查询的输出
X Y Date DAY & NIGHT
-------------- -------------- ---------- -----------
10/25/2019 8AM 10/25/2019 8PM 2019-10-25 AM
10/25/2019 8PM 10/26/2019 8AM 2019-10-25 PM
10/26/2019 8AM 10/26/2019 8PM 2019-10-26 AM
10/26/2019 8PM 10/27/2019 8AM 2019-10-26 PM
笔记
您的日期结构是错误的,如果您将基础数据转换为日期时间,您将按行转换您的数据,您可以提供更好的性能并且不希望在 case 语句中转换为日期时间
注意 当您将数据转换为日期时间时,sql server 给出 24 个结构时间,然后在 12 之前是 AM,之后是 PM