Vinnaren i pepparkakshustävlingen!
2015-03-10, 20:10
  #1
Medlem
Hej,

Håller på att skapa en funktion som skall anropas på följande vis:

select get_date(100) detta skulle ge mig sysdate + 100. Det är alltså fritt för användaren av funktionen att skriva 40, 30, 200 eller vad som helst. Problemet är bara att jag får inte till det med nummer i inparameter. Hade det varit en tabellkolumn som skulle anropas via parameterlistan hade jag redan varit klar nu. Men detta skall dras från dual.

Min taffliga försök har sett ut som följer:

create or replace function get_date(number) eller (number in) men hur fan ska jag lösa denna egentligen översimpla uppgift?
Citera
2015-03-10, 21:02
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av irrator
Hej,

Håller på att skapa en funktion som skall anropas på följande vis:

select get_date(100) detta skulle ge mig sysdate + 100. Det är alltså fritt för användaren av funktionen att skriva 40, 30, 200 eller vad som helst. Problemet är bara att jag får inte till det med nummer i inparameter. Hade det varit en tabellkolumn som skulle anropas via parameterlistan hade jag redan varit klar nu. Men detta skall dras från dual.

Min taffliga försök har sett ut som följer:

create or replace function get_date(number) eller (number in) men hur fan ska jag lösa denna egentligen översimpla uppgift?
Vilket DBMS är det?
Citera
2015-03-11, 14:20
  #3
Medlem
Så här skulle du kunna göra i SQL Server, funktionen använder en rekursiv CTE (alternativet skulle vara en cursor) för att få fram de datum som behövs.

Kod:
CREATE FUNCTION [dbo].[get_date]
(     
      @Param    int

)
-- bestäm returtyp (tabell)
RETURNS  
@SelectedRange    TABLE 
(Dates date)
AS 
BEGIN
--deklarera start och slutdatum 
	declare  @StartDate datetime = sysdatetime()
	declare  @EndDate datetime = dateadd(DAY,@Param,sysdatetime()) 

-- skapa rekursiv CTE som skapar en kolumn "Daterange" med datum
      ;WITH cteRange (DateRange) AS (
            SELECT SYSDATETIME() as Daterange
            UNION ALL
            SELECT DATEADD(dd, 1, DateRange)
            FROM cteRange
            WHERE DateRange <= DATEADD(dd, -1, @EndDate))
          
-- lägg in resultatet av CTE:en till tabellvariabeln 
	INSERT INTO @SelectedRange (Dates)
	SELECT DateRange
	FROM cteRange
	RETURN
END

Därefter anropar du funktionen:
Kod:
SELECT Dates FROM [dbo].[get_date] (10)
Och får resultatet
Kod:
Dates
2015-03-11
2015-03-12
2015-03-13
2015-03-14
2015-03-15
2015-03-16
2015-03-17
2015-03-18
2015-03-19
2015-03-20
2015-03-21
Citera
2015-03-11, 16:03
  #4
Medlem
@StartDate-variabeln skulle jag ju tagit bort
Citera
2015-03-12, 19:27
  #5
Medlem
Citat:
Ursprungligen postat av irrator
Hej,

Håller på att skapa en funktion som skall anropas på följande vis:

select get_date(100) detta skulle ge mig sysdate + 100. Det är alltså fritt för användaren av funktionen att skriva 40, 30, 200 eller vad som helst. Problemet är bara att jag får inte till det med nummer i inparameter. Hade det varit en tabellkolumn som skulle anropas via parameterlistan hade jag redan varit klar nu. Men detta skall dras från dual.

Min taffliga försök har sett ut som följer:

create or replace function get_date(number) eller (number in) men hur fan ska jag lösa denna egentligen översimpla uppgift?
Detta borde fungera. Rättare sagt, det fungerar...testade just...:-)
Kod:
 CREATE OR REPLACE  FUNCTION  get_date 
(
  P_DAYS IN NUMBER
) RETURN DATE iS
L_DATUM DATE;
begin
SELECT trunc(SYSDATE+ p_days )
into L_DATUM FROM DUAL;

RETURN L_DATUM;

END get_date;
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback