我需要一个oracle SQL查询来获取日期列。从日期获取时间段
这些条件:
如果当年即1月1日的第1天是星期六,然后从上周六
每个时期的那一天还有第1期开始28天。 28天后,下一个时期开始并继续。
对于例如,如果日期是2016年2月2日则期限应为2
感谢, 米兰
我需要一个oracle SQL查询来获取日期列。从日期获取时间段
这些条件:
如果当年即1月1日的第1天是星期六,然后从上周六
每个时期的那一天还有第1期开始28天。 28天后,下一个时期开始并继续。
对于例如,如果日期是2016年2月2日则期限应为2
感谢, 米兰
这个查询将在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
你怎么知道'datepart()'或'datediff()'适用于米兰?它们都不是标准的SQL函数。 –
@a_horse_with_no_name ...公平点。 – Ash
这里是另一个一个用于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 |
显示您到目前为止所尝试的内容并告诉您面临的问题? – Murali
问题是我不能开始......如果有人提供了一些逻辑,那么我可以从那里拿。 – Milan6687
所以你需要什么就像日期范围? – Murali