2020-05-18, 20:53
  #1
Medlem
Hur konverterar jag dagens datum till number?
Citera
2020-05-18, 21:01
  #2
Medlem
Vad ska det bli? 20200518? Antal sekunder sen 1970? Nåt annat?
Citera
2020-05-18, 21:18
  #3
Medlem
Jag vill subtrahera sysdate med ett personnummer för att ta reda på hur gammal personen är i dagens datum.
Citera
2020-05-18, 21:25
  #4
Medlem
Protons avatar
Citat:
Ursprungligen postat av bosscs2
Jag vill subtrahera sysdate med ett personnummer för att ta reda på hur gammal personen är i dagens datum.
Det där låter ju som början på en riktig WTF.

Det måste ju finnas något inbyggt i databasen som kan ta reda på hur många år, månader och dagar som skiljer två datum till att börja med, jag hoppas det är så du har tänkt att subtrahera det ena från det andra? I SQL Server heter det DATEDIFF, borde finna nåt motsvarande i Oracle.

Beträffande personnumret skulle jag nog ta och hacka upp det så att år, månader och dagar går att hantera som ett datum och återigen låta databasen räkna ut skillnaden.
Citera
2020-05-18, 21:49
  #5
Medlem
starke_adolfs avatar
Det brukar finnas funktioner för att trunkera och beräkna differenser, exempelvis date_trunc() och date_diff() i postgres. Något i stil med date_trunc kan du använda för att läsa in bitar av- eller hela personnumret, ofta kan du dela in dessa direkt. Sedan använder du som tidigare skribenter redan påpekat date_diff() för att beräkna differensen i termer av månader, dagar eller vad det nu är du vill ha differensen i.

Om du har fel typ får du cast:a till rätt, alt. använda lämplig konverteringsfunktion.
Citera
2020-05-18, 21:52
  #6
Medlem
mannheimer83s avatar
Citat:
Ursprungligen postat av bosscs2
Hur konverterar jag dagens datum till number?
Citat:
Kod:
DECLARE
  v_dob        DATE:= to_date('&v_dob', 'MM/DD/YYYY'); -- copy this line and you'll be fine
  v_your_age   NUMBER(3, 1);
BEGIN
  v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12;  
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);
END;
/

I passed 01/01/2010. Got this in output: 

 Your age is 3.1

Källa: Stackoverflow
Varsågod.

EDIT:
Citat:
Kod:
You may use any of these (pure sql)

SELECT months_between(sysdate, user_birth_date) /12 FROM dual;

or

SELECT floor(months_between(sysdate, user_birth_date) /12) FROM  dual;

or

SELECT EXTRACT(YEAR FROM sysdate) - EXTRACT(YEAR FROM user_birth_date) FROM dual

or

SELECT (sysdate - user_birth_date) / 365.242199 FROM dual

Hope this will help
Källa: Stackoverflow
__________________
Senast redigerad av mannheimer83 2020-05-18 kl. 21:56.
Citera
2020-05-19, 16:10
  #7
Medlem
Kod:
Kod:
DECLARE
  v_dob        DATE:= to_date('&v_dob', 'MM/DD/YYYY'); -- copy this line and you'll be fine
  v_your_age   NUMBER(3, 1);
BEGIN
  v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12;  
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);
END;
/

I passed 01/01/2010. Got this in output: 

 Your age is 3.1

Källa: Stackoverflow

Det verkar funka men jag förstår inte koden helt ut.

1. Stämmer det att TRUNC() räknar ner datum till första dagen i månaden?
2. Är det en poäng med att skriva
Kod:
DATE:= to_date('&v_dob', 'MM/DD/YYYY');
Fyller '&' en funktion?
3. Är MONTHS_BETWEEN ett keyword i PLSQL?
4. Hur är det möjligt att genomföra beräkningar mellan två olika datatyper 'date' och 'number'? Genererar MONTHS_BETWEEN en automatisk typomvandling av sysdate och därför gör det möjligt att senare dividera med 12? Har jag fattat rätt?
Citera
2020-05-19, 18:29
  #8
Medlem
Protons avatar
Citat:
Ursprungligen postat av bosscs2
Kod:
Kod:
DECLARE
  v_dob        DATE:= to_date('&v_dob', 'MM/DD/YYYY'); -- copy this line and you'll be fine
  v_your_age   NUMBER(3, 1);
BEGIN
  v_your_age := TRUNC(MONTHS_BETWEEN(SYSDATE, v_dob))/12;  
  DBMS_OUTPUT.PUT_LINE ('Your age is ' || v_your_age);
END;
/

I passed 01/01/2010. Got this in output: 

 Your age is 3.1

Källa: Stackoverflow

Det verkar funka men jag förstår inte koden helt ut.

1. Stämmer det att TRUNC() räknar ner datum till första dagen i månaden?
2. Är det en poäng med att skriva
Kod:
DATE:= to_date('&v_dob', 'MM/DD/YYYY');
Fyller '&' en funktion?
3. Är MONTHS_BETWEEN ett keyword i PLSQL?
4. Hur är det möjligt att genomföra beräkningar mellan två olika datatyper 'date' och 'number'? Genererar MONTHS_BETWEEN en automatisk typomvandling av sysdate och därför gör det möjligt att senare dividera med 12? Har jag fattat rätt?
Provat att googla?

https://www.techonthenet.com/oracle/functions/trunc_date.php

https://www.techonthenet.com/oracle/functions/months_between.php

montsh_between liksom trunc är med andra ord inbyggda funktioner i språket.
Citera
2020-05-21, 11:44
  #9
Medlem
fnirps avatar
Citat:
Ursprungligen postat av bosscs2
Jag vill subtrahera sysdate med ett personnummer för att ta reda på hur gammal personen är i dagens datum.

Just personnummer är lite luriga i sig själva faktiskt. Allt beror ju på om du har manuell inmatning eller om det kommer en tvättad och kontrollerad lista....

1. Personnummer och organisationsnummer ser väldigt lika ut vid första anblicken

2. Minustecknet talar om ifall personen är under eller över etthundra år (dvs du "byter" personnummer när du fyller hundra och får ett plustecken där istället).

3. Det finns något som heter samordningsnummer och det är vid första anblicken inget giltigt datum på de första sex siffrorna. Men det är faktiskt giltigt datum om man drar bort 60 från dagsiffrorna.

4. Vissa statliga myndigheter (tex Försäkringskassan) envisas med att kräva sekelsiffror på personnumret, så det är inte längre 11 tecken långt, utan 13 tecken långt.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in