2012-11-14 8 views
5

Podczas testów nie udało mi się zauważyć nieprawidłowego wpisu daty/czasu do bazy danych w przypadku niektórych zamówień. Zamiast wpisywać datę i godzinę, tylko wprowadzam datę. Użyłem poprawnego znacznika czasu createodbcdatetime(now()), ale użyłem cfsqltype="cf_sql_date", aby wprowadzić go do bazy danych.Znajdź wiersze w bazie danych bez żadnego czasu w kolumnie datetime

Mam szczęście, że poprawnie zapisano datę/godzinę zamówienia, co oznacza, że ​​mogę wykorzystać czas z pola daty/czasu zamówienia.

Moje pytanie może być filtrowane dla wszystkich wierszy w tabeli z wprowadzonymi datami. Moje dane poniżej;

Table Name: tbl_orders

uid_orders dte_order_stamp 
2000   02/07/2012 03:02:52 
2001   03/07/2012 01:24:21 
2002   03/07/2012 08:34:00 

Tabela Nazwa: CAN tbl_payments

uid_payment dte_pay_paydate  uid_pay_orderid 
1234   02/07/2012 03:02:52 2000 
1235   03/07/2012   2001 
1236   03/07/2012   2002 

muszę być w stanie wybrać wszystkie płatności z żadnym momencie wszedł z tbl_payments, ja wtedy pętla wokół wyników pobierając czas z mojej tabeli zamówień dodaj go do daty z mojej tabeli płatności i zaktualizuj pole o nową datę/czas.

Potrafię w dużym stopniu obsłużyć ponowne włożenie daty/czasu. To tylko wybór wierszy bez czasu, o których nie jestem pewny?

Każda pomoc zostanie doceniona.

Poniżej znajduje się SELECT dla obu zleceń płatności i jeśli muszą być połączone. (Tylko FYI)

SQL Server 2008, Cold Fusion 9

SELECT 
    dbo.tbl_orders.uid_orders, 
    dbo.tbl_orders.dte_order_stamp, 
    dbo.tbl_payment.dte_pay_paydate, 
    dbo.tbl_payment.uid_pay_orderid 
    FROM 
    dbo.tbl_orders 
    INNER JOIN dbo.tbl_payment ON (dbo.tbl_orders.uid_orders = dbo.tbl_payment.uid_pay_orderid) 


    SELECT 
    dbo.tbl_orders.uid_orders, 
    dbo.tbl_orders.dte_order_stamp 
    FROM dbo.tbl_orders 

SELECT 
    uid_paymentid, 
    uid_pay_orderid, 
    dte_pay_paydate, 
FROM 
    dbo.tbl_payment 
+0

Czy mogę zapytać, dlaczego chciałbyś przechowywać te informacje w dwóch miejscach? Na pierwszy rzut oka sądzę, że podważyłbym strukturę danych. – mikeY

+0

Witam mikeY Powodem tego jest sytuacja, w której klienci będą mogli płacić na koncie, a data/godzina płatności będzie rejestrować poszczególne płatności. Mam jednak szczęście, że klient jeszcze tego nie rozpoczął, dlatego zamówienia zostały rozliczone w tym samym czasie, kiedy zamawiam, dlatego mogę teraz pobrać czas zamówienia. W późniejszym terminie będą to prawie na pewno różne daty i godziny. –

+0

OK. Widzę. Tylko dlatego, że daty rozliczenia w tbl_payments są teraz równe dacie zamówienia, nie oznacza to, że zawsze będzie. A klient x może potencjalnie mieć więcej niż jedną płatność w tbl_payments dla zamówienia nr 2001. Dziękuję za wyjaśnienie. Byłem tylko ciekawy. – mikeY

Odpowiedz

6

Wybierz rekordy, w których godziny, minuty, sekundy i milisekundy mają wartość zero.

select * 
from table 
where datePart(hour, datecolumn) = 0 
and datePart(minute, datecolumn) = 0 
and datePart(second, datecolumn) = 0 
and datePart(millisecond, datecolumn) = 0 
+0

Cześć Nathan, działało idealnie! Dziękuję Ci! –

6

Prawdopodobnie można dostać te wartości by casting do time i sprawdzania 0:

SELECT * FROM table WHERE CAST(datetimecolumn AS TIME) = '00:00' 

które nie mogą być szczególnie efektywne, choć w zależności od tego, jak inteligentne SQL Serve Indeksy r są.

+0

+1 Przyjemne użycie 'time' :) – Leigh

+0

Umm ... podczas uruchamiania tego kodu dostaję czas jest niekompatybilny z tinyint? Pole jest zdecydowanie ustawione na datetime? –

+1

Hm może potrzebować zrobić '= '00: 00'' zamiast' = 0' lub coś w tym stylu. Nie mam kopii programu SQL Server do przetestowania. –

3

Coś jak to powinno działać:

.... 
WHERE CAST(CONVERT(VARCHAR, dbo.tbl_payment.dte_pay_paydate, 101) AS DATETIME) = 
      dbo.tbl_payment.dte_pay_paydate 

ta zwróci wszystkie wiersze, gdzie czas nie brakuje.

+0

Działa to z dodatkowym = usunięty (zgodnie z sugestią Leigh) Dziękuję. –

+1

FYI, odpowiedź zaktualizowana, aby poprawić małą literówkę. – Leigh

Powiązane problemy