2012-08-10 19 views
13

Tamam. here Daha önce bir SQL backend ile çalışmak için çok fazla yardım aldım ... sadece benim için değil: (çalıştığım küçük ofis için zaman saati çözümü, bu yüzden daha fazlası için geri dönüyorum)SQL TAMAMLAYICI GÜNCELLEŞTİRME SONUCU OLUŞTURDUĞUNDA YAZILIM TAMAMLAYINIZ

(

  1. clockDate tarih değil boş PK
  2. userName varchar (50) değil boş PK
  3. clockIn süresi (0)
  4. koparma zamanı: Şu anda çalışıyorum

    Benim tablo 6 sütundan oluşmaktadır 0)

  5. breakIn zamanı (0)
  6. CLocKOUT süresi (0)

Gerçi benim son soruya benim IF NOT EXISTS INSERT ELSE UPDATE deyimi anladım, ama şimdi oldukça düz bir sorguda yerine, saklı yordam kullanmak çalışıyorum pencere, hiçbir başarı ile. Temel olarak, kullanıcının bir saatin hızlandırması no-brainer'tır. Ancak, kullanıcı saat alamıyorsa, ancak öğle yemeği için dışarı çıkarsa, ifadenin varolan bir satırı güncellemek yerine satırı oluşturması gerekir. kullanıcı Ben saklı yordam hala ifadenin INSERT bölümünü çalıştırmak için çalışıyor, çünkü birincil anahtar ihlali olsun gün içinde saati DID Eğer

ALTER PROCEDURE dbo.BreakOut 
(
    @userName varchar(50) 
) 
AS 

IF EXISTS (SELECT * FROM Clock WHERE clockDate = GETDATE() AND userName = @userName) 
    BEGIN 
     UPDATE Clock SET breakOut = GETDATE() 
      WHERE clockDate = GETDATE() AND userName = @userName 
    END 
ELSE 
    BEGIN 
     INSERT INTO Clock (clockDate, userName, breakOut) 
      VALUES (GETDATE(), @userName, GETDATE()) 
    END 

İşte ... benim sorunum: Tamam işte benim saklı yordamı var ve asla UPDATE satırını çalıştırmaz. Ben de aynı sonucu ile bir IF NOT EXISTS ile ters çevrilmiş denedim. IF-ELSE'nin saklı bir prosedürde çalışması için ne işe yarar? Bu şekilde düşünebilir miyim ya da Merge bildirimi okumak zorunda mıyım? Planım saklı yordamları, her iş istasyonunda basit bir Visual Basic programından çalıştırmaktır. Sadece bir zaman saati çözüm satın almak Belki kötü patronuma için kafamın :(aşkın alıyorum çok ucuz

DÜZENLEME:! düşüyorum !!

Yardımlarınız için teşekkür ederiz TÜM Bu sitedeki aşık, sorular cevaplar KADAR HIZLI olsun !!! İşte benim çalışma saklı işlemdir:?

ALTER PROCEDURE dbo.BreakOut 
(
    @userName varchar(50) 
) 
AS 

IF EXISTS (SELECT * FROM Clock WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName) 
    BEGIN 
     UPDATE Clock SET breakOut = GETDATE() 
      WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName 
    END 
ELSE 
    BEGIN 
     INSERT INTO Clock (clockDate, userName, breakOut) 
      VALUES (GETDATE(), @userName, GETDATE()) 
    END 

bu doğru mu, yoksa Yine TÜM çok teşekkür ederim daha geliştirilebilir !!!

+1

IF EXISTS (SELECT * FROM Clock WHERE DATEADD(D, 0, DATEDIFF(D, 0, clockDate)) = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName) 
Bu sizin IF deyimi var - bu zaman döndüren olarak bu da, şimdi çünkü) alışkanlık zaman gETDATE (bir rekor var var! Ne yapmak istediğiniz, o tarihte o kullanıcı için zaten bir kayıt olup olmadığını görmek. – dash

+1

Teşekkür ederiz @dash !! – tmhalbert

cevap

9

Muhtemelen burada sorun şu: WHERE clockDate = GETDATE()

GetDate, geçerli tarihi ve geçerli saati (clockDate ile uyuşmayan) döndürür. Bunun yerine DateDiff tarihleri ​​karşılaştırabilirsiniz: GETDATE bir tarih ve saati döndürdüğü için

WHERE DateDiff(dd, GetDate(),clockDate) = 0 
+1

Bu cevabı işaretlerdim ama itibara sahip değilim, üzgünüm! AMA TEŞEKKÜRLER !!!!!!! – tmhalbert

+0

Gelecek ay bu güne geldiğimde sorun olur mu, hayır mı? Tarih dizesinin gün kısmına atıfta bulunan 'dd' mi? – tmhalbert

+0

Bunun yerine 'dy' kullanabilir miyim? – tmhalbert

3

Senin sorunun şu olması görünür:

 
ClockDate userName clockIn breakOut breakIn clockOut 
12/08/2012 joe   09:00  NULL  NULL  NULL 

:

kullanıcı aşağıdaki gibi bir kayıt mevcut olabilecek 09:00

en hızına sahip düşünelim

Şimdi IF deyiminiz bunu yapıyor:

SELECT * FROM Clock WHERE clockDate = "20120812 17:24:13" AND userName = @userName 

, yani bu kayıt mevcut değildir.

yerine

, şunu deneyin:

IF EXISTS (SELECT * FROM Clock WHERE clockDate = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName) 

Ayrıca GETDATE() yalnızca tarih kısmı olarak clockDate saklamak emin olmak gerekir, aksi takdirde bu yüzden gibi sorgu ayarlamak gerekir:

+0

Bunu kırdığın yolu sev, Teşekkür ederim! – tmhalbert

0
CREATE PROCEDURE `SP_GENRE_SELECT`(
    IN _Id INTEGER, 
     IN _Name VARCHAR(50), 
     IN _account VARCHAR (50), 
     IN _Password VARCHAR (50), 
     IN _LastConnexionDate DATETIME, 
     IN _CreatedDate DATETIME, 
     IN _UpdatedDate DATETIME, 
     IN _CreatedUserId INTEGER, 
     IN _UpdatedUserId INTEGER, 
     IN _Status TINYINT 
    ) 
BEGIN 
     SELECT * 
     FROM user 
     WHERE Id LIKE IF(_Id IS NULL,'%',CAST(_Id AS VARCHAR(50))) 
     AND 
     Name LIKE IF(_Name IS NULL,'%',CONCAT('%',_Name,'%')) 
     AND 
     Account LIKE IF(_Account IS NULL,'%',CONCAT('%',_Account,'%')) 
     AND 
     LastConnexionDate LIKE IF(_LastConnexionDate IS NULL,'%',CONCAT('%',CAST(LastConnexionDate AS VARCHAR(50),'%'))) 
     AND 
     CreatedDate LIKE IF(_CreatedDate IS NULL,'%',CONCAT('%',CAST(_CreatedDate AS VARCHAR(50),'%'))) 
     AND 
     UpdatedDate LIKE IF(_UpdatedDate IS NULL,'%',CONCAT('%',CAST(_UpdatedDate AS VARCHAR(50),'%'))) 
     AND 
     CreatedUserID LIKE IF(_CreatedUserID IS NULL,'%',CONCAT('%',CAST(_CreatedUserID AS VARCHAR(50),'%'))) 
     AND 
     UpdatedUserID LIKE IF(_UpdatedUserID IS NULL,'%',CONCAT('%',CAST(_UpdatedUserID AS VARCHAR(50),'%'))) 
     AND 
     Status LIKE IF(_Status IS NULL,'%',CAST(_Status AS VARCHAR(50),'%')) 

END 
İlgili konular