簡體   English   中英

將MS Access查詢轉換為T-SQL-datepart函數

[英]Converting MS Access query to T-SQL - datepart function

我正在將一些MS Access查詢轉換為T-SQL(用於SQL報告服務),但是遇到了問題。

在MS Access查詢中,有一個名為DATEPART的函數,該函數具有兩個可選參數(相應的T-SQL DATEPART函數不具有的參數):firstdayofweek和firstfirstofofyear。 而且我不知道如何在T-SQL中創建等效查詢。

以下是原始的MS Access查詢(僅精簡為相關數據):

SELECT datepart("ww",OrderDate, 7, 2) AS WeekNumber FROM Orders;

注意:在這種情況下,7表示將星期六作為一周的第一天,而2表示將一年中的第一星期作為第四(或更多)天的第一周。

如何在T-SQL中執行此操作?

您引用的參數是:

一周的第一天

省略,Access假定星期日是一周的第一天。 此參數可以是下列值之一:

Constant    Value       Explanation
------------------------------------------------
vbUseSystem     0       Use the NLS API setting
vbSunday        1       Sunday (default)
vbMonday        2       Monday
vbTuesday       3       Tuesday
vbWednesday     4       Wednesday
vbThursday      5       Thursday
vbFriday        6       Friday
vbSaturday      7       Saturday

SQL Server SET DATEFIRST的等效項,請注意,此操作從星期一開始,而不是星期日,因此以下命令將返回2(因為今天是星期二);

SET DATEFIRST 1;
SELECT [WEEKDAY] = DATEPART(WEEKDAY, CAST('2015-08-11' AS DATE));

下一個參數是:

每年的第一周

可選的。 它是一個常數,用於指定一年中的第一周。 如果省略此參數,Access將假定包含1月1日的那一周是一年中的第一周。 此參數可以是下列值之一:

Constant            Value   Explanation
---------------------------------------------------------------------------
vbUseSystem         0       Use the NSL API setting
vbFirstJan1         1       Use the first week that includes Jan 1st (default)
vbFirstFourDays     2       Use the first week in the year that has at least 4 days
vbFirstFullWeek     3       Use the first full week of the year

標准DATEPART(WEEK, @Date)等效於vbFirstJan1 ,這將在1月1日的第一天重置周號,然后在每次傳遞設置為DATEFIRST時都增加1。

該clostest相當於vbFirstFourDays是使用DATEPART(ISO_WEEK, @Date) ,ISO標准定義了一年的第一周的第一周包含4天,這不完全等效的,因為這不是受影響DATEFIRST的ISO標准將星期定義為星期一至星期日,因此ISO_WEEK也將其定義為星期三,無論DATEFIRST或區域設置如何。

vbFirstFullWeek完全沒有等效項。

我發現通常是由業務邏輯決定與這些標准的周數或天數定義之間的偏差,因此,通常最好通過構建自己的日歷表來最好地解決這一問題,然后可以向其中添加新列,然后運行一次更新。 例如,我不得不報告從周四到周三的幾周以支付佣金,其中一年的第一周被定義為第一周(因此,訪問權限為DATEPART("ww", [Date], 4, 5) ),在MS SQL中沒有等效功能,所以我在日歷表PaperSalesCommissionWeekNumber添加了新列,然后我可以加入日歷表以獲取星期數:

SELECT  c.PaperSalesCommissionWeekNumber
FROM    dbo.Deal AS d
        INNER JOIN dbo.Calender AS c
            ON d.DealDate = c.DateKey;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM