Buongiorno
ho due campi [Periodo dal] e [Periodo al] della tabella Dichiarazione, mi serve estrarre gli anni i mesi e i giorni . Es. ho lavorato dal 01.02.2025 al 06.02.2025, il risultato che devo ottenere è: 0 anni, 0 mesi , 6 giorni.
Ho creto le 3 colonne nella struttura query con le seguenti stinghe:
Anni: DateDiff("aaaa";[Periodo dal];[Periodo al])+(Format([Periodo al];"mmgg")<Format([Periodo dal];"mmgg"))
Mesi: Int((DateDiff("m";[Periodo dal];[Periodo al])+Int(Format([Periodo al];"gg")<Format([Periodo dal];"gg")))) Mod 12
Giorni: IIf(Day([Periodo dal])<=Day([Periodo al]);Format([Periodo al];"gg")-Format([Periodo dal];"gg");Day(DateSerial(Year([Periodo dal]);Month([Periodo dal])+1;0))-Day([Periodo dal])+Day([Periodo al]))+1
i risultati sono giusti e perfetti ma il problema per cui chiedo aiuto è che : se i due campi di origine sono vuoti (cioè il dipendente non ha mai lavorato prima) nel campo Giorno della query mi scrive errore, questo non mi permette di inserire in altra tabella i dati 0,0,0 e ne di estrarre un formato excel dei periodi.
ho trovato qui https://learn.microsoft.com/it-it/sql/t-sql/functions/datediff-transact-sql?view=sql-server-ver16
questo , ma non riesco nemmeno a partire probabilmente per la mia poca esperienza:
-- DOES NOT ACCOUNT FOR LEAP YEARS
DECLARE @date1 AS DATETIME, @date2 AS DATETIME, @result AS VARCHAR (100);
DECLARE @years AS INT, @months AS INT, @days AS INT, @hours AS INT, @minutes AS INT, @seconds AS INT, @milliseconds AS INT;
SET @date1 = '1900-01-01 00:00:00.000';
SET @date2 = '2018-12-12 07:08:01.123';
SELECT @years = DATEDIFF(yy, @date1, @date2);
IF DATEADD(yy, -@years, @date2) < @date1
SELECT @years = @years - 1;
SET @date2 = DATEADD(yy, -@years, @date2);
SELECT @months = DATEDIFF(mm, @date1, @date2);
IF DATEADD(mm, -@months, @date2) < @date1
SELECT @months = @months - 1;
SET @date2 = DATEADD(mm, -@months, @date2);
SELECT @days = DATEDIFF(dd, @date1, @date2);
IF DATEADD(dd, -@days, @date2) < @date1
SELECT @days = @days - 1;
SET @date2 = DATEADD(dd, -@days, @date2);
SELECT @hours = DATEDIFF(hh, @date1, @date2);
IF DATEADD(hh, -@hours, @date2) < @date1
SELECT @hours = @hours - 1;
SET @date2 = DATEADD(hh, -@hours, @date2);
SELECT @minutes = DATEDIFF(mi, @date1, @date2);
IF DATEADD(mi, -@minutes, @date2) < @date1
SELECT @minutes = @minutes - 1;
SET @date2 = DATEADD(mi, -@minutes, @date2);
SELECT @seconds = DATEDIFF(s, @date1, @date2);
IF DATEADD(s, -@seconds, @date2) < @date1
SELECT @seconds = @seconds - 1;
SET @date2 = DATEADD(s, -@seconds, @date2);
SELECT @milliseconds = DATEDIFF(ms, @date1, @date2);
SELECT @result = ISNULL(CAST (NULLIF (@years, 0) AS VARCHAR (10)) + ' years,', '')
+ ISNULL(' ' + CAST (NULLIF (@months, 0) AS VARCHAR (10)) + ' months,', '')
+ ISNULL(' ' + CAST (NULLIF (@days, 0) AS VARCHAR (10)) + ' days,', '')
+ ISNULL(' ' + CAST (NULLIF (@hours, 0) AS VARCHAR (10)) + ' hours,', '')
+ ISNULL(' ' + CAST (@minutes AS VARCHAR (10)) + ' minutes and', '')
+ ISNULL(' ' + CAST (@seconds AS VARCHAR (10)) + CASE
WHEN @milliseconds > 0
THEN '.' + CAST (@milliseconds AS VARCHAR (10))
ELSE ''
END + ' seconds', '');
SELECT @result;