2015-12-04 37 views
1

我的任務是創建表值函數,該函數將具有一個DATETIME參數,並且該函數返回每月從第一天到最後一天的每個日期,例如,我從該參數中給出了功能日期04/12/2015,它將打印12月的所有31天日期。使用表值函數找出每月從第一天到最後一天的每個日期

我已經創建了2個標量函數(這是在暗示分配)一個計算第一天

CREATE FUNCTION firstday 
(
@first DATETIME 
) 
RETURNS DATETIME 
AS 
BEGIN 
RETURN CAST(MONTH(@first) AS VARCHAR) + '/' + '01/' + + CAST(YEAR(@first) AS VARCHAR) 
END 

和第二計算最後一天:

CREATE FUNCTION lastday 
(
    @last DATETIME 
) 
RETURNS DATETIME 
AS 
BEGIN 
RETURN CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@last))),DATEADD(mm,1,@last)),101) 
END 

這裏是有價值的表函數但我不知道如何使用它內部的標量函數

CREATE FUNCTION get_months_dates 
(
    @mydate DATETIME 
) 
RETURNS TABLE 
AS 
RETURN 
WITH Calender AS 
(
SELECT **first_function** AS CalenderDate 
UNION ALL 
SELECT CalenderDate + 1 FROM Calender 
WHERE CalenderDate + 1 <= **last_function** 
) 
SELECT [Date] = CONVERT(VARCHAR(10),CalenderDate,25) 
FROM Calender 
OPTION (MAXRECURSION 0) 

我是我們ing sql-server 2014.

回答

1

我們不是在這裏爲你做功課,或是它破壞了作業的目的。

這就是說,一些小技巧,讓你去 -

  • 使用CAST以這樣的字符串不建立自己的FirstDay - 這不是跨不同系統設置不同的服務器可靠。在非美國服務器上運行它,它會失敗。改爲使用DATEADD和DATEPART。
  • 查找數字/計數表。把它和DATEADD結合起來,你就不在了。
  • 功能被稱爲內嵌像在SELECT語句別的 - 所以選擇功能(參數)FROM表

祝你好運!

0

嘗試這樣的事情....

Declare @Date DATE = '20151104'; 

WITH X AS 
(
SELECT TOP (31) 
     YEAR(@Date) AS [Year] 
     ,MONTH(@Date) AS [Month] 
     ,RIGHT('00' + CAST(ROW_NUMBER() 
      OVER (ORDER BY (SELECT NULL)) AS VARCHAR(2)),2) [Days] 
FROM master..spt_values 
), Dates AS 
(
SELECT TRY_CONVERT (DATE, (CAST([Year] AS varchar(4)) 
          + CAST([Month] AS varchar(2)) 
          + CAST([Days] AS varchar(2)))) DatesVals 
FROM X 
) 
Select * FROM Dates 
Where DatesVals IS NOT NULL 
+0

如果我們要完全做拉薩的作業,而不是指出他們如何去做,那麼讓我們給出最佳做法。這是2014年的SQL,我們可以使用DATEFROMPARTS - https://msdn.microsoft.com/en-GB/library/hh213228.aspx – eftpotrm

+0

哈哈,真的很好說,直到你提到它是一個家庭作業才意識到:) –

+0

@ eftpotrm我已經使用datefromparts的方法將無法正常工作,因爲我從spt_values表中選擇了前31位,並且在月數少於31天時將失敗。 –

0

此功能將創建在一個月內減去格式的所有日期的列表。你應該能夠自己動手添加:

功能:

CREATE FUNCTION f_get_months_dates 
(
    @mydate DATETIME 
) 
RETURNS TABLE 
AS 
RETURN 
WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)), 
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a) 
SELECT top (day(EOMonth(@mydate))) 
    dateadd(d, N, EOMonth(@mydate, -1)) CalendarDate 
FROM tally 
ORDER BY N 

如何使用功能的示例:

SELECT CalendarDate 
FROM f_get_months_dates(getdate()) 

結果:

當月內所有時間

-1

您可以嘗試使用DateAdd函數來獲取所有日期。下面是示例如何做到這一點:

Create FUNCTION dbo.DatesBetween(@mydate date) 
RETURNS @dates TABLE (
    DateValue date NOT NULL 
) 
AS 

BEGIN 
declare @startDate Date= dbo.firstday(@mydate); 
declare @endDate Date=dbo.lastday(@mydate); 

    WHILE (@startDate <= @endDate) BEGIN 
     INSERT INTO @dates VALUES (@startDate); 
     SET @startDate = DATEADD(day, 1, @startDate); 
    END; 

    RETURN; 
END; 


select * from dbo.DatesBetween(GETDATE()) ; 
相關問題