Funzioni in sql

lunedì 16 giugno 2008 - 18.50

trinity Profilo | Guru

Salve ragazzi,
si può creare e se si come una funzione che mi restituisca sempre il primo giorno del mese pèartendo solamente da una data che può essere lo stesso primo del giorno oppure un qualsiasi giorno di un mese x.
Mi spiego meglio supponiamo che io ho una data di fine lavoro pari a 15/06/2008 e devo ottenere la prima data del mese di giugno ossia il 01/06/2008 pertanto come dovrei procedere?

Io per ottenere l'ultima data di un mese ho creato la seguente funzione:

CREATE FUNCTION [dbo].[GetLastDateOfMounth] (@Date datetime) RETURNS datetime WITH EXECUTE AS CALLER AS BEGIN DECLARE @DateInt datetime SET @DateInt = DATEADD(day, -1, DATEADD(month, 1, CONVERT(char( 6),@Date, 112) + '01')) RETURN(@DateInt) END

posso modificare questa per ottenere il risultato che desidero?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>si può creare e se si come una funzione che mi restituisca sempre
>il primo giorno del mese pèartendo solamente da una data che
>può essere lo stesso primo del giorno oppure un qualsiasi giorno
>di un mese x.

Ciao Fabio,

Si, è possibile ottenere quello che chiedi in diversi modi.
Ti illustrerò un metodo basato esclusivamente sulle funzioni DATEADD e DATEDIFF che non comporta alcun cast implicito a varchar, ottenendo quindi prestazioni migliori

L'algoritmo è molto semplice: calcoliamo il numero di mesi tra la data passata come argomento ed una data base (ad esempio l'1 gennaio 1900), poi sommiamo questo numero di mesi alla data base, ottenendo il risultato sperato
L'1 gennaio 1900 equivale alla base date del datatype datetime, pertanto equivale al numero 0.

USE tempdb; GO CREATE FUNCTION dbo.ufn_GetFirstMonthDay( @Today datetime ) RETURNS datetime BEGIN RETURN DATEADD(month, DATEDIFF(month, 0, @Today), 0); END GO SELECT dbo.ufn_GetFirstMonthDay('20080601') AS FirstMonthDay UNION ALL SELECT dbo.ufn_GetFirstMonthDay(CURRENT_TIMESTAMP) UNION ALL SELECT dbo.ufn_GetFirstMonthDay('20080630'); /* Output: FirstMonthDay ----------------------- 2008-06-01 00:00:00.000 2008-06-01 00:00:00.000 2008-06-01 00:00:00.000 (3 row(s) affected) */ DROP FUNCTION dbo.ufn_GetFirstMonthDay;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

grazie ho capito e funziona perfettamente.

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5