MSSQL - obliczenie stażu pracy. Miesiące na dwóch znakach po przecinku.

0

Witam,

wyciągnąłem datę zatrudnienia w formie "1996-09-19 0000.000".

Na podstawie tych danych muszę wyliczyć staż pracy który musi mieć taką formę:

W latach i miesiącach (miesiące
na dwóch znakach po przecinku).
Np. 6 miesięcy = 0,06,
2 lata i 11 miesięcy = 2,11

Proszę o pomoc.

0

Pomijając, że taka reprezentacja odbije się komuś czkawką, to może jeszcze pokażesz, jak sobie teraz liczysz ten staż, i z czego w związku z tym należy zrobić konwersję do "R,M"? ;-)

0
fourfour napisał(a):

Pomijając, że taka reprezentacja odbije się komuś czkawką, to może jeszcze pokażesz, jak sobie teraz liczysz ten staż, i z czego w związku z tym należy zrobić konwersję do "R,M"? ;-)

tak to robię, ale tak jest źle. zwraca mi tylko liczbę miesięcy ;)
DATEDIFF(month, nasza_data
, GETDATE()) AS 'ilosc-miesiecy',

1
select convert(decimal(12,2), convert(varchar(18), DATEDIFF(month, nasza_data, GETDATE())/12)+'.'+right('0'+convert(varchar(18), DATEDIFF(month, nasza_data, GETDATE())%12), 2))
0
Paweł Dmitruk napisał(a):
select convert(decimal(12,2), convert(varchar(18), DATEDIFF(month, nasza_data, GETDATE())/12)+'.'+right('0'+convert(varchar(18), DATEDIFF(month, nasza_data, GETDATE())%12), 2))

O to chodziło. Dziękuje bardzo Panie Pawle :)

Mam jeszcze jeden, podobny problem, ale tutaj wynik już mam wpisany w tabeli.
Trzeba go jednak obrobić.

SELECT "HisZatrud"."HZT_StazLata", "HisZatrud"."HZT_StazMies", "HisZatrud"."HZT_StazDni", "HisZatrud"."HZT_PraId", "HisZatrud"."HZT_Etaty", "HisZatrud"."HZT_DkmId" FROM "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE HZT_PraId in ('106', '105', '109')

Zapytanie wyciąga mi staż pracy ogółem w formie:

HZT_Staz_Lata = 11 , HZT_Staz_miesiace = 2

muszę obie komórki połączyć ze sobą, a następnie przekształcić do formatu:

 0,06 = 6 miesięcy,
2,11 = 2 lata i 11 miesięcy,
12,00 = 12 lat i 0 miesięcy,
12,05 = 12 lat i 5 miesięcy,       

czyli w tym wypadku HZT_Staz_Lata = 11 , HZT_Staz_miesiace = 2 wynik powinien wyglądać tak:

11,02

Poszukałbym rozwiązania w internecie, ale nie mam czasu na to. Do dziś mam termin z Z 12 dla G U S.

//EDIT

Czegoś takiego użyłem CAST(HZT_StazLata as VARCHAR(5)) + ', ' + CAST(HZT_StazMies AS VARCHAR(5))
niestety wynik jest taki 11,2, a musi być 11,02. Tam gdzie miesiąc jest w zakresie 1-9 to musi go poprzedzać 0

**Rozwiązałem ;)

 case 
WHEN CAST(HZT_StazMies AS VARCHAR(5))  = '1' then '01'**
0
SELECT "HisZatrud"."HZT_StazLata", "HisZatrud"."HZT_StazMies", 
CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazLata")+'.'+RIGHT('0'+CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazMies"), 2)) czas_po_przecinku, "HisZatrud"."HZT_StazDni", "HisZatrud"."HZT_PraId", "HisZatrud"."HZT_Etaty", "HisZatrud"."HZT_DkmId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId in ('106', '105', '109')
0
Paweł Dmitruk napisał(a):
SELECT "HisZatrud"."HZT_StazLata", "HisZatrud"."HZT_StazMies", 
CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazLata")+'.'+RIGHT('0'+CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazMies"), 2)) czas_po_przecinku, "HisZatrud"."HZT_StazDni", "HisZatrud"."HZT_PraId", "HisZatrud"."HZT_Etaty", "HisZatrud"."HZT_DkmId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId in ('106', '105', '109')

Niestety jest problem.

W bazie mam również pracowników którzy po zapytaniu

    select HZT_StazLata, HZT_StazMies from  "CDN_Baza"."CDN"."HisZatrud" "HisZatrud"
 WHERE  HZT_PraId in ('190')

Zwracają mi taki wynik:

HZT_StazLata	HZT_StazMies
0	                        6
0	                        6
0	                        1
1	                        0
0	                        4
0	                        5
0	                        4
0	                        5
0	                        2
0

Z czym jest konkretnie problem?

0
Paweł Dmitruk napisał(a):

Z czym jest konkretnie problem?

Źle się wyraziłem. Chodziło mi o pracownika, a nie pracowników.

Mam pracownika który zwraca mi wynik:

HZT_StazLata    HZT_StazMies
1                           6

i tu Twoje rozwiązanie zadziała. Ale mam też pracownika który zwraca mi:

HZT_StazLata	HZT_StazMies
0	6
0	6
0	1
1	0
0	4
0	5
0	4
0	5
0	2

co w takim przypadku? Jakieś sumowanie?

0

Zależy, co chcesz uzyskać. Czy to ma być suma, cy może maksymalna, czy może minimalna, a może ostatnia wartość. Nie znam tego programu, ale jeżeli ma to być suma, to np.

SELECT 
Sum(CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazLata")+'.'+RIGHT('0'+CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazMies"), 2))) czas_po_przecinku, 
"HisZatrud"."HZT_PraId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId IN ('106', '105', '109', '190') group by "HisZatrud"."HZT_PraId"
0
Paweł Dmitruk napisał(a):

Zależy, co chcesz uzyskać. Czy to ma być suma, cy może maksymalna, czy może minimalna, a może ostatnia wartość. Nie znam tego programu, ale jeżeli ma to być suma, to np.

SELECT 
Sum(CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazLata")+'.'+RIGHT('0'+CONVERT(VARCHAR(18), "HisZatrud"."HZT_StazMies"), 2))) czas_po_przecinku, 
"HisZatrud"."HZT_PraId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId IN ('106', '105', '109', '190') group by "HisZatrud"."HZT_PraId"

Wynik Twojego zapytania to:

czas_po_przecinku
1.33

Są dwa błędy w wyniku. 1. Osoba przepracowała 45 miesięcy, a nie 15,3. 2. Wynik końcowy musi być zapisany w formie 1,03.

45/12 = 3.75. Zaokrąglimy i mamy wynik 3.80 czyli 3,08,

0

Przepraszam za błędne zapytanie, właśnie skleiłem, że podałem błędnie

SELECT 
Sum(CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), (sum("HisZatrud"."HZT_StazLata")*12+sum("HisZatrud"."HZT_StazMies"))/12)+'.'+RIGHT('0'+CONVERT(VARCHAR(18), (sum("HisZatrud"."HZT_StazLata")*12+sum("HisZatrud"."HZT_StazMies"))%12), 2))) czas_po_przecinku, 
"HisZatrud"."HZT_PraId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId IN ('106', '105', '109', '190') group by "HisZatrud"."HZT_PraId"
0

Wystąpił błąd:

Msg 130, Level 15, State 1, Line 2
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

0
SELECT 
CONVERT(DECIMAL(12,2), CONVERT(VARCHAR(18), (SUM("HisZatrud"."HZT_StazLata")*12+SUM("HisZatrud"."HZT_StazMies"))/12)+'.'+RIGHT('0'+CONVERT(VARCHAR(18), (SUM("HisZatrud"."HZT_StazLata")*12+SUM("HisZatrud"."HZT_StazMies"))%12), 2)) czas_po_przecinku, 
"HisZatrud"."HZT_PraId" FROM   "CDN_Baza"."CDN"."HisZatrud" "HisZatrud" WHERE  HZT_PraId IN ('106', '105', '109', '190') GROUP BY "HisZatrud"."HZT_PraId"

1 użytkowników online, w tym zalogowanych: 0, gości: 1