1

Konu: datetime field da sorgulama nasıl yapılır

Hem tarihi hem de zamanı kaydetmem gerekli bir tablom var. Bu durumda en doğalı datetime tipinde bir field kullanmak, Ancak sorulamayı sadece date olarak yapmam gerek.

Indeksi nasıl oluşturmalıyım?

Ya da sorgulamayı nasıl yapmalıyım? (Örn. DTOT() fonksiyonunu denedim olmadı)

Forumda aradım ancak tam yanıtını bulamadım.

Teşekkürler.

2

Re: datetime field da sorgulama nasıl yapılır

datetime dan sadece tarihi seçip sorgulayabilirsin

ltdatetime = {^2013/01/26 00:00:00}
thisform.text2.Value = SUBSTR(TTOC(ltdatetime,3),1,10)

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

3

Re: datetime field da sorgulama nasıl yapılır

Xdatetime=DATETIME(2013,1,21,8,25,55)
? Xdatetime
? TtoD(Xdatetime)

INDEX ON TtoD(datetimeAlan) TAG Xxx
SEEK TtoD(Xdatetime)

VFP9 SP2

4

Re: datetime field da sorgulama nasıl yapılır

Halihazirda cozumlerin var. Biraz daha katki olsun diye yaziyorum.

Asla datetime() alanlarda = veya >=, <= ile sorgulama yapma (VFP tablosu ise). Neden dersen, datetime() alanlar 2 adet 32 bitlik verinin birlestirilmesiyle real bir deger olarak olarak saklaniyor ( 1.2388238... gibi). Tam sayi kismi gunu, kesir ise gun icindeki zamani tutuyor. Sadece saniye bazina kadar gitmiyor, fazlasi var ama sen gormuyorsun. Sonuc olarak senin gorsel olarak esit gordugun iki datetime farkli olabiliyor. 0, 3, 6, ... 12 ...saatleri problemsiz iken 1, 2, 4, 5 ... saatlerinde esitlik problem yasiyorsun ornek olarak (tam bolunebilirlik nedeniyle, ve binary sistemde kesirlerde kayip kacinilmaz).

Cozum olarak karsilastirmayi, datetime tipinde degil, karaktere cevirip o tipte yapiyorsun:

Visual Fox Pro
index on ttoc( dateTimeAlan, 1 ) tag tarihSaat

 
 
ltArama = datetime()
 
if seek( ttoc(m.ltArama,1), 'tablo', 'tarihSaat' )
* ...
 
if seek( left(ttoc(m.ltArama,1), 12), 'tablo', 'tarihSaat' ) && Dakika hassasiyetinde
*...
 
if seek( left(ttoc(m.ltArama,1), 10), 'tablo', 'tarihSaat' ) && Saat hassasiyetinde
*...
 
if seek( left(ttoc(m.ltArama,1), 8), 'tablo', 'tarihSaat' ) && Gun hassasiyetinde
*...
 
if seek( left(ttoc(m.ltArama,1), 6), 'tablo', 'tarihSaat' ) && Yil+Ay hassasiyetinde
*...
 
if seek( left(ttoc(m.ltArama,1), 4), 'tablo', 'tarihSaat' ) && Yil hassasiyetinde
*...

Seek() disinda da >, >= , <= , < ... islemlerinde rahatlikla kullanirsin.

5

Re: datetime field da sorgulama nasıl yapılır

Çok teşekkürler ilginize.

Çok yararlı oldu benim için.

Bir başka fikir olarak;
madem datetime 32-bitlik 2 değişkenden oluşuyor ve ancak dönüştürmelerle işi götürüyoruz. O zaman karakter tipinde iki field yapıp birinde date saklasam (8 karakter) ötekinde de time'ı (4 karakter) saklasam ve sadece kayıt yaparken datetime'dan dönüştürmeyi yapsam diye düşündüm.

INDEX ON tarih+saat TAG zaman gibi.

6 Son düzenleyen, cetinbasoz (20.02.2013 14:57:44)

Re: datetime field da sorgulama nasıl yapılır

kandilzade yazdı:

Çok teşekkürler ilginize.

Çok yararlı oldu benim için.

Bir başka fikir olarak;
madem datetime 32-bitlik 2 değişkenden oluşuyor ve ancak dönüştürmelerle işi götürüyoruz. O zaman karakter tipinde iki field yapıp birinde date saklasam (8 karakter) ötekinde de time'ı (4 karakter) saklasam ve sadece kayıt yaparken datetime'dan dönüştürmeyi yapsam diye düşündüm.

INDEX ON tarih+saat TAG zaman gibi.

Hic dusunme ve yapma. Benden oncekiler de oyle dusunmus ve yapmis, yaklasik 10+ senedir acisini ben cekiyorum (bizdeki daha iyi aslinda biri tarih (date), yaninda iki tane saat (karakter). Kodlarimi gorsen, adim basi oradan oraya cevirim var neredeyse.

7

Re: datetime field da sorgulama nasıl yapılır

Burada bir sorum daha olacak;
SEEK ile diyelim gün hassasiyetinde uygun bir kayıt buldum. O gün kaydedilen bütün kayıtları almak için nasılbir kod yazmalıyım?
SCAN WHILE ..?

ENDSCAN


Teşekkürler

8

Re: datetime field da sorgulama nasıl yapılır

N tane yolu var. Biraz da o kayitlarla ne yapacagina bagli, istedigini secersin:

Visual Fox Pro
* set exact default off

ldGun = date(2013,1,1)
lcAranan = dtoc(m.ldGun, 1)
select myTable
set order to tag TarihSaat
if seek( dtoc(m.ldGun, 1), 'myTable', 'TarihSaat' ) && 2 ve 3. parametreleri kullanmak benim aliskanligim
   scan while ttoc(tSiparis,1) = m.lcAranan
     *...
   endscan
endif

Izole hali daha iyi olabilir (ilgili kayitlarin secimi bir fonksiyon olabilir):

Visual Fox Pro
SiparislerByDate(tdate(2013,1,1))

select crsGunlukSiparisler
scan
     *...
endscan
 
procedure SiparislerByDate(tdDate, tcCursorName)
local lnSelect, lcAranan
lnSelect = select()
 
lcAranan = dtoc( m.ldDate, 1) + '%'
 
tcCursorName = evl( m.tcCursorName, 'crsGunlukSiparisler' )
 
select * from myTable where ttoc(tsSiparis, 1) like m.lcAranan into cursor (m.tcCursorName) nofilter
 
select (m.lnSelect)
endproc

9

Re: datetime field da sorgulama nasıl yapılır

İkinci şıktaki kod benim için ilginç ve ilgi çekici ve uygulamama aday.

Her zamanki gibi çok öğretici.

Örneğin nofilter diye bir şey duymamıştım (zaten bu konuda çok bilgili sayılmam ama).

Çok teşekkürler.