Sql üzerindeki Datetime değerinin milisaniye olarak alınması [Çözüldü]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Sql üzerindeki Datetime değerinin milisaniye olarak alınması [Çözüldü]

Mesaj gönderen adelphiforumz »

Selamlar

Veritabanında bulunan datetime alanı içerisinde getdate() ile kayıt yapıldığında milisaniye olarak veriyi kayıt ediyor
delphi tarafında sorguda bu tarih alanı
Query1.Parameters.ParamByName('PrmZaman').Value := Query2.Parameters.ParamByName('Zaman').AsDateTime;

şeklinde Open edildiğinde eğer veritabanında milisaniye varsa kayıt dönmüyor.

delphi içerisinde milisaniyeyi dikkate alacak şekilde nasıl bir where sql cümlesi oluşturmalıyım. ve parametre atamalıyım.

Teşekkürler
En son adelphiforumz tarafından 13 Eki 2016 03:20 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen ertank »

Merhaba,

Örnek verdiğiniz kod sorunu anlamaya yönelik çok bilgi vermiyor gibi. Bir Query parametresi içindeki bilgiyi diğer Query parametresine atama yapıyorsunuz. Ancak ikinci parametre içine atamanın nasıl yapıldığı bilinmiyor.

Bu anlamda biraz daha detay bilgi verebilir misiniz?
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen adelphiforumz »

ertank hocam

en iyi örnek uygulama ile anlatılır diye düşündüm
aşağıda örnek uygulama mevcut
çalışan ve çalışmayan diye iki buton yaptım
üstteki gridden bir kayıt seçip butonlara basın
nedemek istediğimi daha iyi anlamış olursunuz

Kod: Tümünü seç

create table [dbo].[TableTestZaman](
	[IdAuto] [int] identity(1,1) not null,
	[Zaman] [datetime] null,
	[Bilgi] [varchar](50) null,
 constraint [PK_TableTestZaman] primary key clustered 
(
	[IdAuto] asc
)with (pad_index  = off, statistics_norecompute  = off, ignore_dup_key = off, allow_row_locks  = on, allow_page_locks  = on) on [PRIMARY]
) on [PRIMARY]
go

insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '1')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '2')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '3')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '4')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '5')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '6')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '7')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '8')
WAITFOR DELAY '00:00:00.010'
insert into TableTestZaman (Zaman, Bilgi) values  (getdate(), '9')

Kod: Tümünü seç

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 594
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 34
    Top = 112
    Width = 447
    Height = 135
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object sButton1: TsButton
    Left = 73
    Top = 263
    Width = 75
    Height = 25
    Caption = #199'al'#305#351'an'
    TabOrder = 1
    OnClick = sButton1Click
  end
  object DBGrid2: TDBGrid
    Left = 30
    Top = 304
    Width = 451
    Height = 165
    DataSource = DataSource2
    TabOrder = 2
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object sButton2: TsButton
    Left = 241
    Top = 259
    Width = 75
    Height = 25
    Caption = #199'al'#305#351'mayan'
    TabOrder = 3
    OnClick = sButton2Click
  end
  object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    CursorType = ctStatic
    Parameters = <>
    Left = 136
    Top = 64
  end
  object ADOConnection1: TADOConnection
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 52
    Top = 12
  end
  object DataSource1: TDataSource
    DataSet = ADOQuery1
    Left = 230
    Top = 62
  end
  object DataSource2: TDataSource
    DataSet = ADOQuery2
    Left = 150
    Top = 468
  end
  object ADOQuery2: TADOQuery
    Connection = ADOConnection1
    Parameters = <>
    Left = 80
    Top = 472
  end
end

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton, Vcl.Grids, Vcl.DBGrids, Data.DB, Data.Win.ADODB;

type
  TForm1 = class(TForm)
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    sButton1: TsButton;
    DataSource2: TDataSource;
    ADOQuery2: TADOQuery;
    DBGrid2: TDBGrid;
    sButton2: TsButton;
    procedure sButton1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure sButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Text := 'Select *, convert(varchar(24), Zaman, 121) as YeniZaman from TableTestZaman';
    ADOQuery1.Open;
end;

procedure TForm1.sButton1Click(Sender: TObject);
begin
    ADOQuery2.Close;
    ADOQuery2.SQL.Text :=  'Select * from TableTestZaman ' +
                            ' where convert(varchar(24), Zaman, 121) = :PrmZaman';
    ADOQuery2.Parameters.ParamByName('PrmZaman').Value := ADOQuery1.FieldByName('YeniZaman').AsString;
    ADOQuery2.Open;
end;

procedure TForm1.sButton2Click(Sender: TObject);
begin
    ADOQuery2.Close;
    ADOQuery2.SQL.Text :=  'Select * from TableTestZaman ' +
                            ' where Zaman = :PrmZaman';
    ADOQuery2.Parameters.ParamByName('PrmZaman').Value := ADOQuery1.FieldByName('Zaman').AsDateTime;
    ADOQuery2.Open;
end;

end.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen ertank »

ADO TDateTime atamalarında DateTimeToStr() fonksiyonunda olduğu gibi Tarih içindeki milisaniye bilgisini almaz.

İstediğinizi aşağıdaki şekilde gerçekleştirmeniz mümkün

Kod: Tümünü seç

    ADOQuery2.Parameters.ParamByName('PrmZaman').Value := FormatDateTime('yyyymmdd hh:nn:ss.zzz', ADOQuery1.FieldByName('Zaman').AsDateTime);
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen adelphiforumz »

ertank yazdı:Mesaj gönderen ertank » 13 Eki 2016 02:34

ADO TDateTime atamalarında DateTimeToStr() fonksiyonunda olduğu gibi Tarih içindeki milisaniye bilgisini almaz.

İstediğinizi aşağıdaki şekilde gerçekleştirmeniz mümkün
KOD: TÜMÜNÜ SEÇ
    ADOQuery2.Parameters.ParamByName('PrmZaman').Value := FormatDateTime('yyyymmdd hh:nn:ss.zzz', ADOQuery1.FieldByName('Zaman').AsDateTime);
Ertank hocam siz bu yazdığınızı denedinizmi
bu ilk hata ile aynı hatayı veriyor.
Zaman nesnesi zaten milisaniye barındırmıyor sorunum bu.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen ertank »

Parametre için DataType belirlemeniz gerekiyor diye eklemeyi unutmuşum.

Kod: Tümünü seç

    ADOQuery2.Parameters.ParamByName('PrmZaman').DataType := ftWideString;
    ADOQuery2.Parameters.ParamByName('PrmZaman').Value := FormatDateTime('yyyymmdd hh:nn:ss.zzz', ADOQuery1.FieldByName('Zaman').AsDateTime);
Sizin SQL içinde yazdığınız YeniZaman alanı convert kullandığınız için ADO tarafından WideString türünde bir alan olarak algılandığı için ve parametreye string türünde değer verdiğiniz için çalışıyor.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Sql üzerindeki Datetime değerinin milisaniye olarak alınması

Mesaj gönderen adelphiforumz »

ertank hocam dediğiniz şekilde çalıştı teşkkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla