sql server'den tarih ve saat bilgisini alma

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

sql server'den tarih ve saat bilgisini alma

Mesaj gönderen dynamo »

veritabanında "datetime" olarak tanımlanmış TARIH ve SAAT iki alan var.dbgrid'te bu alanların görüntüsü :
Resim
[/img]

SAAT alanında sadece saat bilgisi görünsün istiyorum.bunu nasıl yaparız?

yada ,sonuçta tarih ve saat bilgisini tek bir alanda tuttuğuna göre programdan kaydederken SAAT alanına

Kod: Tümünü seç

ADOQuery2.FieldByName('SAAT').AsString:=tarih+' '+saat;
şeklinde kaydedip, bir sql sorgusu ile bu bilgiyi alır, tarih ve saat kısmlarını ayırıp dbgrid'te TARIH ve SAAT olarak nasıl gösterebilirim.?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

http://en.wikibooks.org/wiki/SQL_dialects_reference buradaki Tarih Saat fonksiyonlarına bakarsan (gerçi ms-sql in değişik sürümlerinde farklılık gösterebilir) ms-sql server veri tabanında sadece DATETIME şeklinde tutuyor. Sen de EXTRACT() ve CAST() veya diğer tarih saatle ilgili fonksiyonlara bakabilirsin. Bende kurulu olmadığından deneme şansım yok. Şöyle bir şey olabilir;

Kod: Tümünü seç

select EXTRACT(DATE FROM TARIH_SAAT_ALANI) as Tarih, EXTRACT(TIME FROM TARIH_SAAT_ALANI) as Saat
from tablo_Adi
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

üstad,sql server de EXTRACT fonksiyonu olsaydı verdiğiniz kod tam istediğimi yapacaktı.daha önce CAST ile yapmaya çalışmıştım.fakat saat bilgisini tarihten ayırmıyor.

olay şu:Tabloda datetime tipinde tanımlanmış SAAT alanına hem tarih hem de saat bilgisini birleştirerek kaydediyorum:

Kod: Tümünü seç

ADOQuery2.FieldByName('SAAT').AsString:=DateToStr(Date)+' '+TimeToStr(Time);
şimdi,SAAT alanında kayıtlı olan tarih+saat bilgisini ayırıp dbgridte göstermek istiyorum.

Kod: Tümünü seç

   ADOQuery2.Close;
   ADOQuery2.SQL.Clear;
   ADOQuery2.SQL.Add('SET DATEFORMAT DMY SELECT CAST(CONVERT(CHAR(50),SAAT,103) AS DATETIME) AS TARIH1,CAST(CONVERT(CHAR(50),SAAT,108) AS DATETIME) AS SAAT1 from GECIS');
   ADOQuery2.Open;
tarih bilgisini TARIH1 de doğru gösteriyor. ama saat bilgisini SAAT1 de başında "01.01.1900" ekleyerek gösteriyor. :shock:

işte böyle gösteriyor:


Resim



nasıl olacak bu iş anlıyamadım :( :cry:
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

dynamo yazdı:

Kod: Tümünü seç

   ADOQuery2.Close;
   ADOQuery2.SQL.Clear;
   ADOQuery2.SQL.Add('SET DATEFORMAT DMY SELECT CAST(CONVERT(CHAR(50),SAAT,103) AS DATETIME) AS TARIH1,CAST(CONVERT(CHAR(50),SAAT,108) AS DATETIME) AS SAAT1 from GECIS');
   ADOQuery2.Open;
:( :cry:

Kod: Tümünü seç

 DATEPART(hh,TARIH) AS SAAT from tablom // saati verir
 DATEPART(mi,TARIH) AS DAKIKA from tablom // dakikayı verir
 DATEPART(ss,TARIH) AS SANIYE from tablom // saniyeyi verir

Saat alanını bu şekilde ayırabilirsin.[/code]
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

yine olmadı.....

Kod: Tümünü seç

select DATEPART(hh,SAAT) AS sa,DATEPART(mi,SAAT) AS dk,DATEPART(ss,SAAT) AS sn from GECIS
şeklinde dbgridte -> sa,dk,sn adlı üç alan oluşturmuş oluyoruz.bunu tek bir alanda nasıl birleştiririz?. yani sa,dk,sn yi " AS XXX" şekinde tek alanda "10:12:33" formatında göstermek gerekecek .yani biraz uzun oldu.bunun daha pratik bir yolu yok mu?

yada datetime olarak tanımlanmış alana sadece saat bilgini nasıl kaydederiz? sql server saat i şu formatta kaydediyor : "03.03.2007 10:13:35" .yani başına tarih bilgisi eklemesin.

basit bir şeyde takılıp kaldık... :N(
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Tabiki tek alan olarak alabilirsin, + ile birleştirerek kullanabilirsin. Ama datapart ile aldığın saat bilgileri integer döndüğü için varchar a çevirmelisin:

Kod: Tümünü seç

select CAST(DATEPART(hh,SAAT) AS VARCHAR(2))+':'+ CAST(DATEPART(mi,SAAT) AS VARCHAR(2))+ ':' + CAST(DATEPART(ss,SAAT) AS VARCHAR(2)) AS saat from GECIS
Direk saat:dk:sn cinsinden değer döndürecek birşey varmıydı şuanda hatırlayamadım. Belki bilen biri çıkar, çıkmazsa da bu işini görür.
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

Kod: Tümünü seç

select CAST(DATEPART(hh,SAAT) AS VARCHAR(2))+':'+ CAST(DATEPART(mi,SAAT) AS VARCHAR(2))+ ':' + CAST(DATEPART(ss,SAAT) AS VARCHAR(2)) AS saat from GECIS 

ile olacak gibi..... :roll: ...tek haneli sayıların başına sıfırı nasıl ekleriz?

sorgunun görüntüsü:

Resim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Bence bu alanların uzunluğunu

Kod: Tümünü seç

DATALENGTH 
ile alırsanız alan uzunluklarının 8 olduğunu görecekseniz yani aslında orda sadece saat bilgisi var ama gösterirken Tarihi de ekleyip gösteriyor.

Bence Dbgird de veya dbedit de
Displ.formatı değiştirin. sanırım(hh:mm:ss) işinizi görür.

yani select ederken

Kod: Tümünü seç

 select * from gecis where saat='10:12:33'
Derseniz kayıtlarınıza ulaşırsınız.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
dynamo
Üye
Mesajlar: 96
Kayıt: 21 Haz 2005 02:05
Konum: istanbul

Mesaj gönderen dynamo »

evet haklısınız.uzun bir SQL sorgusundan ziyade pratik bir çözümü olmalıydı.dediğin gibi DisplayFormat ile sorun çözüldü ve sorgu çok pratik bir hale geldi.

Kod: Tümünü seç

   ADOQuery2.Close;
   ADOQuery2.SQL.Clear;
   ADOQuery2.SQL.Add('SET DATEFORMAT DMY SELECT * from GECIS');
   ADOQuery2.Open;

   TDateTimeField(ADOQuery2.FieldByName('SAAT')).DisplayFormat:='hh:mm:ss';

çok tşk...
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Çözümü uygulayıp paylaştığın için teşekkürler.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla