具有时间间隔的 SQL 日期时间

Posted

技术标签:

【中文标题】具有时间间隔的 SQL 日期时间【英文标题】:SQL Datetime with time intervals 【发布时间】:2017-10-25 09:53:09 【问题描述】:

我想显示以下内容:23 Jan 06:00 - 23 Jan 18:0023 Jan 18:00 - 24 Jan 06:00

我不确定我将如何实现这一点,但如果有任何帮助,请。我需要它基本上以上述格式显示今天的日期。我正在尝试为 s-s-rs 中的参数执行此操作,但将其写在 sql 中。这是 12 小时间隔。

期待任何回应。谢谢

【问题讨论】:

【参考方案1】:

请在下面找到 SQL 代码

    如果你想从getdate() 时间开始 12 小时,那么你可以使用下面的代码

    SELECT CONVERT(VARCHAR(24), GETDATE(), 113)+' - '+ 
    CONVERT(VARCHAR(24),DATEADD(HOUR,12,getdate()),113)`
    

    结果会像25 Oct 2017 11:54:19:393 - 25 Oct 2017 23:54:19:393

    如果您想在 06:00 到 18:00 以及接下来的 12 小时从 18:00 到 6:00 显示 getdate(),那么您可以使用以下代码

    SELECT CONVERT(VARCHAR(24), cast(GETDATE() as DATE), 113)+' 06:00 - '+ 
    CONVERT(VARCHAR(24),cast(getdate() as date),113)+' 18:00'  
    union all   
    SELECT CONVERT(VARCHAR(24), cast(GETDATE() as DATE), 113)+' 18:00 - '+ 
    CONVERT(VARCHAR(24),cast(DATEADD(HOUR,24,getdate()) as DATE),113)+' 06:00'
    

    如果您想在 06:00 到 18:00 以及接下来的 12 小时从 18:00 到 6:00 显示没有年份的 getdate(),那么您可以使用以下代码

    SELECT LEFT(CONVERT(VARCHAR(24), cast(GETDATE() as DATE), 113),6)+' 06:00 - '+ 
    LEFT(CONVERT(VARCHAR(24),cast(getdate() as date),113),6)+' 18:00'   
    union all  
    SELECT LEFT(CONVERT(VARCHAR(24), cast(GETDATE() as DATE), 113),6)+' 18:00 - '+ 
    LEFT(CONVERT(VARCHAR(24),cast(DATEADD(HOUR,24,getdate()) as DATE),113),6)+' 06:00'
    

【讨论】:

【参考方案2】:

检查您约会的时间。如果低于 6,则显示昨天晚上/今天早上的时段。如果在 6 点到 17 点之间,则显示今天的 06:00-18:00 时段。如果是 18 岁或以上,请显示晚上/明天早上的时段。

在 Oracle SQL 中,代码如下所示:

SELECT
CASE WHEN To_Char(SYSDATE, 'hh24') < 6 THEN
  To_Char(SYSDATE-1, 'dd Mon') || ' 18:00 - ' || To_Char(SYSDATE, 'dd Mon') || ' 06:00'
  WHEN To_Char(SYSDATE, 'hh24') BETWEEN 6 AND 17 THEN
  To_Char(SYSDATE, 'dd Mon') || ' 06:00 - ' || To_Char(SYSDATE, 'dd Mon') || ' 18:00'
  WHEN To_Char(SYSDATE, 'hh24') >= 18 THEN
  To_Char(SYSDATE, 'dd Mon') || ' 18:00 - ' || To_Char(SYSDATE+1, 'dd Mon') || ' 06:00'
  ELSE 'Error?' END time_interval
FROM DUAL

这个逻辑也应该在 SQL Server 或 s-s-rS 表达式中工作,只是语法略有不同。

【讨论】:

【参考方案3】:

一种方法是使用参数填充数据集。我将解释如何做到这一点。

在报表数据中,向报表添加一个参数。在我的示例中,我将其命名为 @Date。将其数据类型设置为日期/时间。如果您想要今天的日期,请将其默认设置为NOW()

将数据集添加到报告中,随意命名。 将以下查询添加到数据集:

SELECT CAST(DAY(@Date) as varchar) --current day
       + ' ' + CONVERT(varchar(3), @Date, 100) --current month
       + ' 06:00 - ' 
       + CAST(DAY(@Date) as varchar) --still current day
       + ' ' + CONVERT(varchar(3), @Date, 100) --still current month
       + ' 18:00' AS [Period1]

      ,CAST(DAY(@Date) as varchar) --still current day
       + ' ' + CONVERT(varchar(3), @Date, 100) 
       + ' 18:00 - ' 
       + CAST(DAY(DATEADD(DAY, 1, @Date)) as varchar) --usually the next day + 1 but could be first day of next month
       + ' ' + CONVERT(varchar(3), DATEADD(DAY, 1, @Date), 100) --usually the same month but could be next month 
                                                                --if start day was last day of month
       + ' 06:00' AS [Period2]

此代码的作用是获取参数的日期和月份名称。它连接为一个字符串,添加空格、时间和破折号。在计算 06:00 时,请考虑日期编号和月份名称 - 这是因为开始日期可能是该月的最后一天......因此日期编号重置为 1,月份名称更改为下个月。我使用 DATEADD 将 +1 天添加到参数日期,因此这是由函数处理的。

值存储在数据集的 [Period1] 和 [Period2] 中。

【讨论】:

以上是关于具有时间间隔的 SQL 日期时间的主要内容,如果未能解决你的问题,请参考以下文章

SQL记录-PLSQL日期与时间

在 Oracle 中生成具有 2 个日期之间时间间隔的行

如何查找两个不同日期字段SQL在一定时间间隔内是不是匹配?

日期间隔 SQL

范围连接 data.frames - R 中具有日期范围/间隔的特定日期列

用于显示多个日期范围之间的间隔的 SQL 查询