2016-06-09 75 views
-2

我需要一个oracle SQL查询来获取日期列。从日期获取时间段

这些条件:

  1. 如果当年即1月1日的第1天是星期六,然后从上周六

  2. 每个时期的那一天还有第1期开始28天。 28天后,下一个时期开始并继续。

对于例如,如果日期是2016年2月2日则期限应为2

感谢, 米兰

+1

显示您到目前为止所尝试的内容并告诉您面临的问题? – Murali

+0

问题是我不能开始......如果有人提供了一些逻辑,那么我可以从那里拿。 – Milan6687

+0

所以你需要什么就像日期范围? – Murali

回答

0

这个查询将在SQL Server运行在列名和表名 插件在下面的查询中。这是一个非常粗略的解决方案。它需要优化,但也许你可以使用它作为一个基地:

select 
case when 
datepart(dw, DATEADD(yy, DATEDIFF(yy,0,DATECOLUMNHERE), 0)) = 6 then datepart(dy, DATECOLUMNHERE)/28 
else datediff(d,DATEADD(d, -2 - (DATEPART(dw, DATEADD(yy, DATEDIFF(yy,0,DATECOLUMNHERE), 0)) + @@DATEFIRST - 2) % 7,DATEADD(yy, DATEDIFF(yy,0,DATECOLUMNHERE), 0)),DATECOLUMNHERE)/28 
from TABLENAMEHERE 

在第一次检查这不考虑@@ DATEFIRST

查询是

select 
    case when FirstDayOfYear = 6(Saturday) then return (number of days in date column)/28 
else 
    (number of days betwen (last saturday before 01-Jan) and date column) /28 
+0

你怎么知道'datepart()'或'datediff()'适用于米兰?它们都不是标准的SQL函数。 –

+0

@a_horse_with_no_name ...公平点。 – Ash

0

这里是另一个一个用于SQL Server

CREATE Table #YourTable (
    DateColumn date NOT NULL 
); 

INSERT INTO #YourTable 
VALUES ('20160202') 
     ,('20150128') 
     ,('20140128') 
     ,('20130128') 
     ,('20120128') 
     ,('20110128') 
     ,('20100128') 
     ,('20090128') 
     ,('20080128'); 

SELECT *   
FROM #YourTable AS YourTable 
    CROSS APPLY (
     VALUES (DATEADD(day, 1 - DATEPART(dayofyear, YourTable.DateColumn), YourTable.DateColumn)) 
    ) AS CA1(FirstDayOfYear) 
    -- Periods starts saturday before first friday of year 
    CROSS APPLY (
      VALUES ((20 - @@DATEFIRST - DATEPART(weekday, FirstDayOfYear)) % 7) 
    ) AS CA2(DaysUntilFriday) 
    CROSS APPLY (
     VALUES (DATEADD(day, DaysUntilFriday - 6, FirstDayOfYear)) 
    ) AS CA3(PeriodStartDate) 
    CROSS APPLY (
     VALUES(DATEDIFF(day, PeriodStartDate, YourTable.DateColumn)) 
    ) AS CA4(DaysSincePeriodStart) 
    CROSS APPLY (
     VALUES ((DaysSincePeriodStart + 0)/28 + 1) 
    ) AS CA5(PeriodNumber) 

输出

| DateColumn | FirstDayOfYear | DaysUntilFriday | PeriodStartDate | DaysSincePeriodStart | PeriodNumber | 
|------------|----------------|-----------------|-----------------|----------------------|--------------| 
| 2016-02-02 | 2016-01-01  | 0    | 2015-12-26  | 38     | 2   | 
| 2015-01-28 | 2015-01-01  | 1    | 2014-12-27  | 32     | 2   | 
| 2014-01-28 | 2014-01-01  | 2    | 2013-12-28  | 31     | 2   | 
| 2013-01-28 | 2013-01-01  | 3    | 2012-12-29  | 30     | 2   | 
| 2012-01-28 | 2012-01-01  | 5    | 2011-12-31  | 28     | 2   | 
| 2011-01-28 | 2011-01-01  | 6    | 2011-01-01  | 27     | 1   | 
| 2010-01-28 | 2010-01-01  | 0    | 2009-12-26  | 33     | 2   | 
| 2009-01-28 | 2009-01-01  | 1    | 2008-12-27  | 32     | 2   | 
| 2008-01-28 | 2008-01-01  | 3    | 2007-12-29  | 30     | 2   | 
+0

交叉应用,dateadd和datediff在oracle中不起作用。任何选择?逻辑是正确的。 – Milan6687

+0

嗨Adrianm,我可以有相同的逻辑为甲骨文。非常感谢您的帮助。 – Milan6687

+0

@ Milan6687,对不起,我不知道甲骨文。尝试添加一个'Oracle'标签来召集专家。 – adrianm