Q
在函數中計算日期
0
A
回答
2
你可以做在SQL Server中是這樣的:
DECLARE @BaseDate DATE = '20111107';
DECLARE @EndDate DATE = GETDATE(); --Or the "end of dates in the database"
WITH RecursiveCTE AS (
SELECT
1 AS [Counter],
@BaseDate AS [MyDate]
UNION ALL
SELECT
[Counter] + 1,
DATEADD(DAY, 7, MyDate)
FROM
RecursiveCTE
WHERE
MyDate < @EndDate)
SELECT * FROM RecursiveCTE OPTION (MAXRECURSION 0);
處理日期未準確,使這成爲一個功能,你可以這樣做:
--Function definition
CREATE FUNCTION SuperDuperDataCalculator (
@BaseDate DATE = '20131016',
@EndDate DATE = '20131020')
RETURNS @Results TABLE (
[Counter] INT,
[Date] DATE)
AS
BEGIN
WITH RecursiveCTE AS (
SELECT
1 AS [Counter],
@BaseDate AS [MyDate]
UNION ALL
SELECT
[Counter] + 1,
CASE WHEN DATEADD(DAY, 7, MyDate) > @EndDate THEN @EndDate ELSE DATEADD(DAY, 7, MyDate) END
FROM
RecursiveCTE
WHERE
MyDate < @EndDate)
INSERT INTO
@Results
SELECT * FROM RecursiveCTE OPTION (MAXRECURSION 0);
RETURN;
END;
GO
--Usage
SELECT * FROM SuperDuperDataCalculator('20131016', '20131020');
--Results
Counter Date
1 2013-10-16
2 2013-10-20
請注意,我們必須使用多語句表值函數,因爲在SQL Server中的錯誤,它不會讓你用一個簡單的表值函數的選擇。另一種方法是從函數中刪除OPTION(MAXRECURSION 0),並記住在每次引用它時使用它(即相當差的選擇)。
...最後,如果你想只返回計數器值的最大值,你可以重寫這是一個標量值函數,即:
--Function definition
CREATE FUNCTION SuperDuperDataCalculator (
@BaseDate DATE = '20131016',
@EndDate DATE = '20131020')
RETURNS INT
AS
BEGIN
DECLARE @Results TABLE (
[Counter] INT,
[Date] DATE);
DECLARE @ReturnValue INT;
WITH RecursiveCTE AS (
SELECT
1 AS [Counter],
@BaseDate AS [MyDate]
UNION ALL
SELECT
[Counter] + 1,
CASE WHEN DATEADD(DAY, 7, MyDate) > @EndDate THEN @EndDate ELSE DATEADD(DAY, 7, MyDate) END
FROM
RecursiveCTE
WHERE
MyDate < @EndDate)
INSERT INTO
@Results
SELECT * FROM RecursiveCTE OPTION (MAXRECURSION 0);
SELECT @ReturnValue = MAX([Counter]) FROM @Results;
RETURN @ReturnValue;
END;
GO
SELECT dbo.SuperDuperDataCalculator('20131016', '20131020');
0
試試這個 - 這將讓所有的周在子查詢中分配一個rownumber。然後只選擇行號= 1的記錄,因爲該周可能會有更多結果。所以因此RowNo = 1
SELECT ROW_NUMBER() OVER(ORDER BY RowNo) AS IncrementalWeek,dte
FROM
(
SELECT DISTINCT DATEPART(ww,CONVERT(VARCHAR(20),createdDate,111)) AS [week],
CONVERT(VARCHAR(20),createdDate,111) AS dte,
ROW_NUMBER() OVER(PARTITION BY DATEPART(ww,Convert(VARCHAR(20),createdDate,111)) ORDER BY DATEPART(ww,CONVERT(VARCHAR(20),createdDate,111))) AS RowNo
FROM YourTable
) AS tble
WHERE RowNo = 1
ORDER BY [week]
相關問題
- 1. Python中計算excel日期的函數
- 2. Sharepoint,計算列,IF函數和日期
- 3. 從日數計算日期?
- 4. 在JavaScript中計算日期
- 5. 在CouchDB中計算日期
- 6. 在Excel中計算日期
- 7. 在SQL中計算日期
- 8. 計算日期
- 9. 計算日期
- 10. 計算日期
- 11. 計算日期
- 12. 日期計算
- 13. 計算日期
- 14. 按日期計算週數
- 15. 從數字計算日期
- 16. c中的日期計算#
- 17. SAS中的日期計算
- 18. 從excel中計算日期
- 19. 計算中間日期
- 20. 在日期之間計算
- 21. 日期函數來計算僅工作日
- 22. 計算一週中的日期數
- 23. Java中,計算天數兩個日期
- 24. 在日期範圍內計算天數?
- 25. 計算總天數在specied日期
- 26. Laravel日期計算
- 27. SQL日期計算
- 28. EXTJS日期計算
- 29. Excel日期計算
- 30. 計算二日期
如果結束日期是可以說20/10/2013我BaseDate(RecursiveCTE被調用後)爲16/10/2013,則函數應該考慮到20/10後停止/2013.it不應該增加7〜16/10/2013.do我需要檢查過 – newbie 2014-10-22 17:19:29
我補充說,包括這 – 2014-10-23 08:12:31
感謝您的回覆一個新的腳本日期之間的間隔。但它應該添加4至16/10/2013它必須考慮數據庫中的所有日期,在這種情況下是2013年10月20日。我需要一個函數,這樣我可以用書面的Visual Studio C#。我是不知道的SQL查詢的功能名稱,但我在SQL想我們需要寫CREATE FUNCTION Funtionname聲明函數 – newbie 2014-10-23 08:52:47