根据当前日期选择日期

时间:2015-05-06 20:15:20

标签: sql sql-server oracle

我有一个Oracle SQL,它根据当前时间戳选择日期范围。主要思想是在今天的0700和1900之间,或者第二天的1900到0700之间的日期范围内选择发生的记录(moveCompletedOn),具体取决于查询运行时的当前时间戳。

更新:例如:

  • 如果当前时间戳是10AM,则选择必须是:0700到1900
  • 如果当前时间戳是3PM,则选择也必须是:0700到1900
  • 如果当前时间戳是晚上10点,那么从今天到第二天0700的选择必须是1900
  • 如果时间戳是凌晨2点,则选择必须是从昨天到1900的1900

更新2:澄清

只是澄清一下,选择应该是DAY shift和NIGHT shift。从早上7点到晚上7点以及第二天的晚上7点和早上7点。

无论查询运行的时间如何,当前时间戳都将介于这两个选项之间。我只想根据查询运行的时间选择班次中发生的所有记录。如果它在DAY班次期间运行,它将选择DAY班次的所有记录。如果它在NIGHT班次上运行,它将选择NIGHT班次的所有记录。

我希望现在有点清楚。如果没有,请告诉我。

在SQL Server中不是很好,我想知道如何用SQL Server语言重写这段WHERE语句:

   WHERE moveCompletedOn BETWEEN 
   TO_DATE(TO_CHAR(SYSDATE - (12 / 24), 'DD-MON-YYYY ') ||  
      DECODE((TO_CHAR(SYSDATE - (12 / 24), 'HH24MI') / 1200), 0, '07:00', '19:00'), 'DD-MON-YYYY HH24:MI') AND 
   TO_DATE(TO_CHAR(SYSDATE - (12 / 24), 'DD-MON-YYYY ') ||  
      DECODE((TO_CHAR(SYSDATE - (12 / 24), 'HH24MI') / 1200), 0, '07:00', '19:00'), 'DD-MON-YYYY HH24:MI') + (11 / 24))

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在SQL server中,我会做这样的事情

select * from aa
where last_update between 
DATEADD(HOUR, 
    case datepart(hour, getdate() ) 
    when 1 then -3 
    when 2 then -7
    else  -10
    end , 
    GETDATE() 
 ) 
and 
DATEADD(HOUR,  
    case datepart(hour, getdate() ) 
    when 1 then -1 
    when 2 then -5
    else  -5
    end , 
    GETDATE() 
) ;

您可以更改值以满足您的需求。