首页 > 解决方案 > 日夜段中按日期划分的 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 传递给存储过程,现在我的问题是遍历每个日期行并按列(日期、日、夜)检索数据的最佳方法是什么?我曾想过实现一个游标,但有更好的方法吗?

标签: sqlsql-server

解决方案


我使用以下查询为您创建示例数据

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


推荐阅读