2012-08-02 94 views
-1

假設會計年度從7月1日至6月30日開始。從特定期間計算的週數

我必須計算第一週。因此在SQL Server 2005.

請推薦!

非常感謝!

+0

是從7月1日的前七天星期?因此,第53周的最後1 *(或閏年2)*天? – MatBailie 2012-08-02 10:51:39

+0

你從第0周還是第1周開始?你對今年第一週的定義是什麼? – 2012-08-02 10:52:14

+0

請問在使用谷歌之前,請務必不要在這個網站上問一些即使在這裏也是微不足道的東西。無論是哪種情況,對您的問題更具體,並解釋細節以獲得更好的答案。 – Yaroslav 2012-08-02 10:52:51

回答

-1
try this 

    select DATEPART(week,getdate())-DATEPART(week,'07-01-2012') 

To get the week number starting from July 1st 2012 
+0

如果輸入日期是2013年1月1日,則返回負值。 – MatBailie 2012-08-02 10:56:52

+0

此查詢僅給我本週。我必須列出從2000財政年度起的所有星期編號。 – user1571129 2012-08-02 11:05:03

+0

通常SQL服務器刷新每個新年開始的星期數。它意味着它計算從01-01-2012開始的星期數,例如。那麼您是否希望在每年的每次更改時都重置週數,或者您希望自01-01-2000以來獲得總週數? – AnandPhadke 2012-08-02 11:46:03

1

如果您的財政年度第1周始終年7月7月1日至7日...

DECLARE 
    @inputDate DATETIME, 
    @fYearStart DATETIME, 
    @weekNumber INT 
SET 
    @inputDate = getDate() 
SET 
    @fYearStart = DATEADD(year, DATEDIFF(year, '20000101', DATEADD(month, -7, @inputDate)), '20000701') 
SET 
    @weekNumber = DATEDIFF(day, @fYearStart, @inputDate)/7 + 1 


如果你的財政金融周總是星期日至星期六...

DECLARE 
    @inputDate DATETIME, 
    @fYearStart DATETIME, 
    @weekNumber INT 
SET 
    @inputDate = getDate() 
SET 
    @fYearStart = DATEADD(year, DATEDIFF(year, '20000101', DATEADD(month, -7, @inputDate)), '20000701') 
SET 
    @weekNumber = DATEDIFF(WEEK, @fYearStart, @inputDate) 


其中一個或其他應該適用於您的定義week number

+0

在日曆表中我有date,fiscal_year,fiscal_period。如何在此表格或視圖中計算週數? – user1571129 2012-08-02 11:11:14

+0

@ user1571129 - 請在您的問題中包含該表中的示例數據,並顯示您想要的結果示例。然後,我們可以編寫適用於該示例數據的代碼。 – MatBailie 2012-08-02 11:22:55

+0

如果一週從星期一開始。 – user1571129 2012-08-02 12:20:39

1

試試這個,使用可變@dt根據自己的需要:

DECLARE @dt DATETIME = GETDATE() 
SELECT WeekOfMonth = DATEPART(wk, @dt) - DATEPART(wk,DATEADD(m, DATEDIFF(M, 0, @dt), 0)) + 1 

編輯: 我理解錯誤的問題是我的錯,我的解決方案不是返回的年月份的一週。

使用部分@Dems答案並在此處更改礦區是一個完整的工作測試,可輸出3列WeekOfMonth,WeekOfYear和WeekOfFIscalYear,並根據日期和開始臨時表上的會計年度開始。但是我認爲一個財政年度的開始對於一家特定的公司來說總是一樣的。我只是爲測試添加了不同的日期和年份。

DECLARE @TT TABLE (auxVal  INT, 
        auxdate  DATETIME, 
        fiscal_year DATETIME 
       ) 

INSERT @TT 
SELECT 100,'19120101 00:00:00','19120701' UNION ALL 
SELECT 200,'18120615 00:00:00','18110701' UNION ALL 
SELECT 100,'20121121 00:00:00','20120701' UNION ALL 
SELECT 200,'20120101 00:00:00','20110701' UNION ALL 
SELECT 100,'20150802 00:00:00','20140701' UNION ALL 
SELECT 200,'20120330 00:00:00','20110701' UNION ALL 
SELECT 322,'20110228 00:00:00','20100701' 

SELECT DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, auxDate), 0), auxDate) + 1 WeekOfMonth, 
     DATEPART(wk, auxDate) WeekOfYear, 
     DATEDIFF(DAY, (DATEADD(YEAR, DATEDIFF(YEAR, fiscal_year, DATEADD(MONTH, -7, auxDate)), fiscal_year)), auxDate)/7 + 1 WeekOfFiscalYear 
    FROM @TT 

結果:

WeekOfMonth WeekOfYear WeekOfFiscalYear 
------------------------------------------- 
     1   1    27 
     3   25   51 
     4   47   21 
     1   1    27 
     2   32   5 
     5   13   40 
     5   10   35 
------------------------------------------- 
+0

始終將輸出顯示爲1 – AnandPhadke 2012-08-02 11:01:31

+0

爲什麼本輪輸入會在月初?並且基本方法'DATEPART(wk,x) - DATEPART(wk,y)'產生負數,其中x在該年的早些時候比y,即使x在*年之後的年份*。 – MatBailie 2012-08-02 11:04:47

+0

對不起,我不知道你怎麼測試。我正在測試幾個不同的日期,我得到了正確的答案。 – Yaroslav 2012-08-02 11:07:20

0

對我來說這一次的工作:

SELECT dt AS DayDate, 
CONVERT(VARCHAR,DATENAME(weekday,dt)) AS [DayOfWk], 
CONVERT(int,CONVERT(VARCHAR,DATEPART(yyyy,dt)) + RIGHT('00' + CONVERT(VARCHAR,DATEPART(wk,dt)),2)) AS [WeekID], 
'Week ' + CONVERT(VARCHAR,DATEPART(wk,dt))AS [WeekDsc], 
DATEPART(wk,dt) AS [WeekNbr], 
DATEADD(dd, -(DATEPART(dw, dt)-1), dt) AS [WeekStartDay], 
DATEADD(dd, 7-(DATEPART(dw, dt)), dt) AS [WeekEndDay], 
CONVERT(VARCHAR,CASE WHEN DATEPART(mm,dt) > 6 THEN DATEPART(yyyy,dt) + 1 ELSE DATEPART(yyyy,dt) END) + RIGHT('00'+ CONVERT(VARCHAR,DATEDIFF(week,DATEADD(dd, 7-(DATEPART(dw, CASE WHEN DATEPART(mm,dt) > 6 THEN CONVERT(VARCHAR,DATEPART(yyyy,dt)) + '-07-01' ELSE CONVERT(VARCHAR,DATEPART(yyyy,dt) - 1) + '-07-01' END)), CASE WHEN DATEPART(mm,dt) > 6 THEN CONVERT(VARCHAR,DATEPART(yyyy,dt)) + '-07-01' ELSE CONVERT(VARCHAR,DATEPART(yyyy,dt) - 1) + '-07-01' END) + 1,DATEADD(dd, -(DATEPART(dw, dt)-1), dt)) + 2) ,2) AS [FinWkID] 
FROM 
(
    SELECT DATEADD(day,increment,'2014-01-01') dt 
    FROM 
    (
     SELECT top 5000 ROW_NUMBER() OVER (ORDER BY s1.[object_id]) - 1 AS increment 
     FROM sys.all_objects AS s1 
     CROSS JOIN sys.all_objects AS s2 
     ORDER BY s1.[object_id] 
    ) SQ 
) DATE_GENERATOR 
0

而不需要創建一個表。 只需用列日期名稱替換@date

declare @date datetime 
set  @date = '12/8/2016 00:00:00' 

select case when datepart(month,@date) > 6 then 

      case when CEILING(datediff(day,'6/30/' + cast(datepart(year,@date) as nvarchar(4)),@date)/7.0) > 52 
      then 52 else CEILING(datediff(day,'6/30/' + cast(datepart(year,@date) as nvarchar(4)),@date)/7.0) end 

     else 
      case when CEILING(datediff(day,'6/30/' + cast(datepart(year,@date)-1 as nvarchar(4)),@date)/7.0) > 52 
      then 52 else CEILING(datediff(day,'6/30/' + cast(datepart(year,@date)-1 as nvarchar(4)),@date)/7.0) end 
     end WorkWeek 

Compute Week number based on Fiscal Year