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

时间:2017-10-25 09:53:10

标签: sql datetime parameters ssrs-2008

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

我不确定如何实现这一点,但如果有什么可以帮助的话。我需要它基本上以上面的格式显示今天的日期。我试图在ssrs中为参数执行此操作,但在sql中写出来。这是12小时的间隔。

期待任何回复。感谢

3 个答案:

答案 0 :(得分:2)

请找到下面的SQL代码

  1. 如果您想在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

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

    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'
    
  3. 如果您希望在06:00至18:00之间显示getdate(),而在18:00至6:00之间显示12小时,则可以使用以下代码

    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'
    

答案 1 :(得分:0)

检查日期的小时。如果低于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或SSRS表达式,语法略有不同。

答案 2 :(得分:0)

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

在“报表数据”中,向报表添加参数。我在我的例子中将其命名为@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]中。