Jump to content
  • 0

Datum filteren uit tekstveld


Zero55

Question

Hallo,

Ik heb een tekstveld dat gevuld wordt met tijdstempels zoals hieronder:

2019-10-16_124743

2020-5-2_14258

2020-5-13_92648

 

Nu zou ik van alle datums die erin staan de meest recente moeten hebben en controleren of deze 3 maanden ouder is dan de huidige datum (tijd is in deze verwaarloosbaar).

Aangezien de datums in verschillende notities kunnen voorkomen, hoe moet ik hieraan beginnen ??

 

GreeTz

Rudi

Link to post

9 answers to this question

Recommended Posts

  • 0

Je zou een extra calculatieveld kunnen maken dat de datum calculeert. Analyseer eerst de verschillende formaten van de timestamps. Wat je in je voorbeeld laat zien is in ieder geval geen probleem: die zijn nagenoeg eenduidig van het jjjj-m-d_xxxxx formaat (weet niet hoe xxxx geïnterpreteerd moet worden).

Rightwords (FuzzyTimestamp; 1 ) levert een converteerbare datum op.

De rest kan je scripten. 

Link to post
  • 0

Probleem is dat het tekstveld meerdere regels kan bevatten met elk een timestamp.
Daarbij inderdaad nog de verschillende formaten (met of zonder voorloopnul) zoals jjjj-m-d of jjjj-mm,dd of jjjj-mm-d of jjjj-m-dd...

@Marsau de 'xxxxx' is het tijdsgedeelte van de timestamp, 124743 is eigenlijk 12:47:43

Link to post
  • 0

Ik zie steeds het patroon jaar, maand, dag en dat is je houvast. Voorloopnul is niet relevant. Jaartal is in vier cijfers. 

Verder komt het aan op een goede afsplitsing van de datumgedeelte van de rest. In je voorbeelden wordt consequent een underscore “_” gebruikt. Prima. 

Als de datum in plaats van reguliere koppelstreepjes “-“ een comma bevat, zoals in je voorbeeld, heb je hier een probleem. Dan zou je de datum kunnen afsplitsen op basis van de (eerste) underscore. 

Tijd was de niet relevant, maar toch even: hoe laat was het in je tweede en derde voorbeeld?

Je hebt dus een lijstje: dat had ik nog niet begrepen. Je zou met de ‘while’ functie een datum kunnen vinden, per record, dat aan jou criteria voldoet.  Tenminste als dat is wat je wil, want je omschrijft niet zo precies wat je nu wil bereiken.

Als dit het is:

- een lijstje fuzzy timestamps, per record

- per record de laatste datum bepalen

- als deze groter is dan huidige datum - drie maanden. Indien niet dan leeg. 
 

dan is er geen probleem. 
 

Wellicht overbodig om op te merken: als de fuzziness een probleem blijft zou je ook eens moeten kijken of je je data-leverancier(s) kunt dresseren. Je applicatie is immers geen vuilnisbak, veronderstel ik. 

Edited by Marsau
Link to post
  • 0

Die komma was een tikfout zie ik nu 😬
Per record heb ik inderdaad een veld gevuld met verschillende regels met timestamps (zie voorbeeld).
Ik moet dus een manier vinden om de datums af te splitsen van de tijd (tijd mag weg)
De uitkomst is dan een lijst met enkel datums, en uit die lijst de meest recente datum.

Zie ik dat correct?

PS. de While-functie heb ik niet... ik zit nog met FM16 😅

Naamloos.fmp12

Edited by Zero55
Link to post
  • 0

Met deze gegeevns zou je de volgende formule kunnen gebruiken:

Let ( [ 
	myList = Naamloos::timestamp_merge ; 
	srtList = SortValues ( Substitute ( myList ; 
							[ "-1-" ; "-01-" ] ; 
							[ "-2-" ; "-02-" ] ; 
							[ "-3-" ; "-03-" ] ; 
							[ "-4-" ; "-04-" ] ; 
							[ "-5-" ; "-05-" ] ; 
							[ "-6-" ; "-06-" ] ; 
							[ "-7-" ; "-07-" ] ; 
							[ "-8-" ; "-08-" ] ; 
							[ "-9-" ; "-09-" ] ; 
							[ "-1_" ; "-01_" ] ; 
							[ "-2_" ; "-02_" ] ; 
							[ "-3_" ; "-03_" ] ; 
							[ "-4_" ; "-04_" ] ; 
							[ "-5_" ; "-05_" ] ; 
							[ "-6_" ; "-06_" ] ; 
							[ "-7_" ; "-07_" ] ; 
							[ "-8_" ; "-08_" ] ; 
							[ "-9_" ; "-09_" ] ) 
				) ; 
	txt = GetValue ( srtList ; ValueCount ( srtList ) ) ; 
	tdt = Left ( 
			txt ; 
			Position ( txt ; "_" ; 1 ; 1 ) - 1 
			) ; 
	dtl = Substitute ( 
			tdt ; 
			[ "-" ; ¶ ] ) ; 
	dt = If ( length ( dtl ) ; 
		Date ( 
			GetValue ( dtl ; 2 ) ; 
			GetValue ( dtl ; 3 ) ; 
			GetValue ( dtl ; 1 ) 
		) 
	)
] ; 
	dt 
)

 

Link to post
  • 0

Of nog een beetje compacter:

Let ( [
input = "2017-11-15_23423" ;
items = Substitute (input; 
        [ "-" ; "¶" ] ;
        [ "_" ; "¶" ] ;
        [ "," ; "¶" ] ;
        [ "." ; "¶" ] ;
        [ " " ; "¶" ] ;
        [ ";" ; "¶" ]) ] ;
Timestamp ( 
  Date ( GetValue( items ; 2 ) ; GetValue( items; 3 ) ; GetValue( items ; 1 ) ) ;
  Time ( 0 ; 0 ; GetValue( items ; 4 ))
           ))

Je moet eigenlijk nog alle numerieke waarden als Getasnumber omzetten, da's netter. Er er zit geen check op de volgorde natuurlijk.

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...