2009-03-03 23 views
1

Takvim denetimi için starttime ve bitiş zamanı olan bir olay kayıtlarım var. sqlserver date arithmetic problem

istediğim

olayları 2/28/2009

söylemek belirli bir tarihte yapılması için Fakat db tablo formunda 2009/02/28 10:00:00, 2009/02/28 tarih verilere sahip 00:00:00.

Ben VS 2005 IDE içinde oluşturulan bir sproc bu sorguyu denedik ama önceden

ALTER PROCEDURE dbo.spSelectBenchEvent 
( 
@EVENT_DATE DATE // BTW, THIS RETURNS ERROR :CANNOT FIND DATE DATATYPE. 
       //@EVENT_DATE HAS INVALID DATATYPE 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT  ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
    FROM   tbl_benchbook 
    WHERE START_TIME=EVENT_DATE 
    ORDER BY START_TIME 

Teşekkür çalışmadı.

+0

sadece datetime ve tarihe ilişkin küçük tarih saat veri türleri vardır. Bunları kullanın veya varchar olarak event_date öğesini kullanın. – Learning

+0

Veri türü hatası hakkında. Eğer endeks kapsamı – kristof

cevap

2

göz atın:

ve en iyi performans akıllıca bir çözüm kontrolü için: MS SQL Date Only Without Time

Temel olarak kodunuz şöyle görünebilir:

select  
    id, eid, benchid, paccode, start_time, end_time 
from 
    tbl_benchbook 
where start_time >= dateadd(dd, datediff(dd, 0, @event_date), 0) 
and start_time < dateadd(dd, datediff(dd, 0, @event_date)+1, 0) 
2

Tüm olayları 3/29/2009 tarihinde değerlendirmek isterseniz, aşağıdakileri kullanın cluase.

SELECT * 
FROM tableName 
WHERE Date >= '2009/03/29' AND Date < '2009/03/30' 

burada götürmek için anahtar nokta belirli bir tarihte oluştu tüm kayıtları yakalamak için o gün için her zaman değerlerini içeren bir tarih aralığı tanımlamak gerekir olmasıdır.

Mantıklı?

Alkış John

, bununla alakalı çok soru vardı
+0

+1 kullanıyorsanız, tarih datetime tarihi değiştirmeniz gerekir: sadece 30 gün olduysa gerçekten harika bir Şubat olacağını fark ettim :) – Learning

+0

btw kullanan bir yöntem için SQLServer2005 veya önceki – Learning

+0

Bu yöntemle, açıkça sadece tarih gününe bir gün ekleyemiyorum :) – cjk

2

güncellenmiş ques dayanarak, bu çalışması gerekir:

SELECT ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
    FROM tbl_benchbook 
    WHERE START_TIME >= @EVENT_DATE 
    AND  START_TIME < DATEADD(day,1,@EVENT_DATE) 
    ORDER BY START_TIME 
+0

Çok daha net, ancak bir sonraki gün gece yarısı ile herhangi bir başlangıç ​​zamanı alırsınız ("arasında" dahil. Bence> = ve <. Ayrıca EVENT_DATE değil, @ EVENT_DATE gerekir. – Hobo

+0

@ Tümü, yeni bir sorunum var, tarih geçerli bir veri türü olarak tanınmıyor. –

+0

@Hobo: İyi yakalama! Güncelleme yapacağım. – Learning

-1
--1. you need to make sure there is no time on the parameter 
--2. you can just use "+1" on the datetime, to get the next day 



    enter ALTER PROCEDURE dbo.spSelectBenchEvent 
    ( 
    @EVENT_DATE DATETIME 
    ) 
    AS 
    BEGIN TRAN 
    SET NOCOUNT ON; 

    --remove any time from given date 
    SET @EVENT_DATE=CONVERT(char(10),@EVENT_DATE,111) 


    SELECT  ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
      FROM   tbl_benchbook 
      WHERE START_TIME>[email protected]_DATE AND START_TIME<@EVENT_DATE+1 
      ORDER BY START_TIME 
    code here 
+0

üzerinde bir zaman varsa bu işe yaramaz. Bir char'a bir tarih (sayısal) basmak, sayısal olarak bırakmaktan çok daha yavaştır. – StingyJack

+0

sadece bir kez, bir cpu katil neredeyse dönüştürür! –