Some SQL date calculation scripts for NAV Linked Tables
Dato che alcuni utilizzano le viste SQL come tabelle collegate in NAV, riporto alcuni script SQL relativi all’utilizzo delle date; inserendo un campo virtuale in una vista SQL e richiamando una “function” esistente o personalizzata nel campo (es: la uf_DaysDifference sotto indicata) è possibile creare delle viste SQL molto utili da utilizzare in NAV.
esempio di alcune viste da me utilizzate in cruscotti di avanzamento
– Avanzamento Ordini Vendita\Acquisto\Commesse\Timesheets
– Avanzamento Fasi di Produzione
– Avanzamento Shop Floor etc..
SQL Date Scripts
Calcolare l’ultimo giorno di un mese
DECLARE @oggi DATETIME
SET @oggi = GETDATE()
SELECT CONVERT(varchar, DATEADD ( dd , -1 , CONVERT (VARCHAR(6), DATEADD( mm , 1 , @oggi ) , 112 ) + ’01’ ) ,103)
Se @oggi = 09/01/2016
La select ritorna = 31/01/2016
Details:
— Aggiungo 1 mese alla data odierna:
SELECT DATEADD( mm , 1 , getdate())
— Visualizzo la data senza il giorno:
SELECT CONVERT (VARCHAR(6), DATEADD( mm , 1 , getdate()) , 112 )
— Imposto il primo giorno del mese:
SELECT CONVERT (VARCHAR(6), DATEADD( mm , 1 , getdate()) , 112 ) + ’01’
— Tolgo 1 giorno dalla data ottenuta:
SELECT DATEADD ( dd , -1 , CONVERT (VARCHAR(6), DATEADD( mm , 1 , getdate()) , 112 ) + ’01’ )
— Formatto il risultato in italiano (gg/mm/aaaa):
SELECT CONVERT(varchar, DATEADD ( dd , -1 , CONVERT (VARCHAR(6), DATEADD( mm , 1 , getdate()) , 112 ) + ’01’ ) ,103)
Calcolare il numero giorni di un mese
declare @data datetime
set @data = getdate()
select day(dateadd(month,1,@data)-(day(@data)-1)-1) as NumGiorniMese
— Trovo la data da elaborare aumentata di un mese:
select dateadd(month,1,@data)
— Imposto la nuova data con giorno = 1:
select dateadd(month,1,@data)-(day(@data)-1)
— Tolgo un giorno alla data:
select dateadd(month,1,@data)-(day(@data)-1)-1
— Leggo il numero di giorni:
select day(dateadd(month,1,@data)-(day(@data)-1)-1)
Calcolare differenza giorni
/* Differenza in giorni */
CREATE FUNCTION uf_DaysDifference (@dataIniziale DATETIME, @dataFinale DATETIME)
RETURNS INT
AS
BEGIN
RETURN
(
SELECT CASE WHEN
DATEADD(DAY, DATEDIFF(DAY, @dataIniziale, @dataFinale), @dataIniziale) > @dataFinale
THEN DATEDIFF(DAY, @dataIniziale, @dataFinale) – 1
ELSE DATEDIFF(DAY, @dataIniziale, @dataFinale) END
)
END
GO
/* Ad esempio: */
select dbo.uf_DaysDifference(‘20160109′,’20160114’) as NumGiorni
select dbo.uf_DaysDifference(‘20060109’,getdate()) as NumGiorni
select dbo.uf_DaysDifference(‘20060109’,CURRENT_TIMESTAMP) as NumGiorni
IsZero
Funzione che converte 0 in altro numero, utile in viste o stored procedures.
CREATE FUNCTION IsZero (
@Number FLOAT,
@IsZeroNumber FLOAT
)
RETURNS FLOAT
AS
BEGIN
IF (@Number = 0)
BEGIN
SET @Number = @IsZeroNumber
END
RETURN (@Number)
END
es: isZero(<campo>; 1) –> converte o in 1
