Zapytanie SQL z warunkiem where

0

Witam serdecznie mam taki problem w bazie danych jest tabela paragon i posiada ona kolumny Idtowar, DataCzas, Zmiana, Kasaid, Brutto, Kasjer, IloscPoz i wiele jeszcze innych kolumn, ale nie będę wymieniał wszystkich. Chcę się skoncentrować na kolumnie DataCzas. Wykonuje select w następujący sposób :

select
[KasaId]
,[DataCzas]
,[Zmiana]
,[Kasjer]
,[IloscPoz]
,[Brutto]
from paragon

Mam wynik widzę dokładnie te kolumny które wpisałem w select

Teraz chciałem dołożyć warunek where

select
[KasaId]
,[DataCzas]
,[Zmiana]
,[Kasjer]
,[IloscPoz]
,[Brutto]
from paragon
where KasaId = 1

i do tego miejsca działa jeśli wpisuję wartość 1 lub 2 lub 3, natomiast kolumna DataCzas posiada dokładnie takie wpisy :

2012-09-26 1500
2012-09-26 1500
2012-09-26 1400

jest to data czas importu paragonu z kasy fiskalnej do tabeli

Robię takie przykładowe testowe zapytanie :

select
[KasaId]
,[DataCzas]
,[Zmiana]
,[Kasjer]
,[IloscPoz]
,[Brutto]
from paragon
where DataCzas = 2012-09-26 1500

i mam taki wynik :

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '15'.

A konkretnie chodzi mi o zapytanie żeby select pokazał wszystkie wpisy w tabeli które w kolumnie DataCzas są od 01 września do 30 września pomiędzy godzinami np. od 15 do 20. Chce wiedzieć jaka jest sprzedaż na przełomie jakiegoś okresu czasu ale pomiędzy konkretnymi godzinami np. od 15 do 20. I jeśli się da to żeby zsumował w tabeli Brutto wartości, ale to nie jest konieczne bo to mogę sobie to zrobić w exelu.

0

Nie wiem czy dobrze zrozumialem - jezeli tak to wyglada na to, ze problem tkwi w zlym przekazaniu daty.

zamiast:

2012-09-26 15:04:00

sprobuj

"2012-09-26 15:04:00"

lub

'2012-09-26 15:04:00'

lub

`2012-09-26 15:04:00`

Ktores z powyzszych powinno zadzialac :)

0

where DataCzas >= '2012-09-01 0000 ' and (hour(dataCzas) between 15 and 20)

Sprawdź

0
kaaa napisał(a):

where DataCzas >= '2012-09-01 0000 ' and (hour(dataCzas) between 15 and 20)

Sprawdź

Nie zadziałało otzrymałem taki wynik :

Msg 195, Level 15, State 10, Line 3 'hour' is not a recognized built-in function name.

Tak wygląda select tych kolumn :

Bez-nazwy-1.jpg

Zrobiłem jeszcze tak :

where zmiana BETWEEN '2012-09-01 1500.000' and '2012-09-01 2000.000'

i zadzaiałało ale tylko w jednym dniu, a chciałbym podać zakres kilkiu dni

0
tk napisał(a):

Nie wiem czy dobrze zrozumialem - jezeli tak to wyglada na to, ze problem tkwi w zlym przekazaniu daty.

zamiast:

2012-09-26 15:04:00

sprobuj

"2012-09-26 15:04:00"

lub

'2012-09-26 15:04:00'

lub

`2012-09-26 15:04:00`

Ktores z powyzszych powinno zadzialac :)

Jest dużo lepiej z takim apostrofem '2012-09-26 1500' widać wpisy w tabeli select działa, ale teraz mam pytanie czy da się na podstawie takiego wpisu w tabeli da się wyciągnąć np:

od 2012-09-01 do 2012-09-30 od godziny 15.00.00 do godziny 20.00.00 sprzedaż towarów. Można to wyciągnąć z tabeli DataCzas lub Zmiana

Tak wygląda select tych kolumn :

Bez-nazwy-1.jpg

Zrobiłem jeszcze tak :

where zmiana BETWEEN '2012-09-01 1500.000' and '2012-09-01 2000.000'

i zadzaiałało ale tylko w jednym dniu, a chciałbym podać zakres kilkiu dni

0

Ze screenow wynika, ze pracujesz na bazie MSSQL - na przyszlosc dobrze byloby gdybys to zaznaczyl, poniewaz czasem sa roznice miedzy roznymi dialektami.

Co do zapytania: nie mam teraz pod reka silnika na ktorym pracujesz, ale kombinuj mniej wiecej tak:

SELECT [lista kolumn] FROM [nazwa tabeli] WHERE 
(DATE([kolumna z datą]) BETWEEN '[data od]' AND '[data do]') 
AND 
(TIME([kolumna z datą]) BETWEEN '[czas od]' AND '[czas do]')

Tekst w nawiasach kwadratowych uzupelnij sobie wg. uznania :) Dodam, ze w miejscach oznaczonych jako "data od" i "data do" podajesz tylko date, a nie date i godzine.

0
tk napisał(a):

Ze screenow wynika, ze pracujesz na bazie MSSQL - na przyszlosc dobrze byloby gdybys to zaznaczyl, poniewaz czasem sa roznice miedzy roznymi dialektami.

Co do zapytania: nie mam teraz pod reka silnika na ktorym pracujesz, ale kombinuj mniej wiecej tak:

SELECT [lista kolumn] FROM [nazwa tabeli] WHERE 
(DATE([kolumna z datą]) BETWEEN '[data od]' AND '[data do]') 
AND 
(TIME([kolumna z datą]) BETWEEN '[czas od]' AND '[czas do]')

Tekst w nawiasach kwadratowych uzupelnij sobie wg. uznania :) Dodam, ze w miejscach oznaczonych jako "data od" i "data do" podajesz tylko date, a nie date i godzine.

Dzięki wielkie za pomoc naprowadziłeś mnie, wykombinowałem coś takiego i działa, ale jeszcze raz dziekuję za pomoc

where DataCzas between '2012-09-01' and '2012-09-26'
and datepart(hh, DataCzas) between '20' and '22';

0
darjar napisał(a):

Dzięki wielkie za pomoc naprowadziłeś mnie, wykombinowałem coś takiego i działa, ale jeszcze raz dziekuję za pomoc

where DataCzas between '2012-09-01' and '2012-09-26'
and datepart(hh, DataCzas) between '20' and '22';

Uwazalbym na tego typu konstrukcje. Nie wiem jak jest w MSSQL ale w MySQL takie zapytanie moze nie dawac Ci poprawnych wynikow. Data '2012-09-26' moze zostac zrozumiana przez silnik bazodanowy jako '2012-09-26 0000', a co za tym idzie moze dojsc do sytuacji kiedy nie wyswietla Ci sie rekordy o wartosci np '2012-09-26 1500'.

Ponadto wyrazenie

datepart(hh, DataCzas) between '20' and '22'

oznacza, ze interesuje nas czas, ktorego godzina miesci sie w przedziale od 20 do 22, wiec zwrocony zostanie wynik zarowno dla godziny 22:00 jak i dla 22:50. Posprawdzaj sobie czy moje obawy sa sluszne :)

0

Tak masz rację, ale zobacz co mi zwraca tabela po zastosowaniu Twojego wpisu. Wolałbym podawać dokłady zakres godzinowy, ale nie bardzo wiem już jak to zrobić.

Msg 195, Level 15, State 10, Line 5
'hh' is not a recognized built-in function name.

Bez-nazwy-2jpg.jpg

0

Uzylem tych nawiasow kwadratowych po to aby podkreslic, ze sa to dane ktore musisz sobie uzupelnic - zapytanie nie powinno ich zawierac.

Jest jednak inny problem: wyglada na to, ze w dialekcie MSSQL nie ma funkcji DATE i TIME. Przegladajac na szybko internet doszedlem do wniosku ze mozna je zastapic funkcja CONVERT. Mozesz wiec sprobowac wyslac zapytanie podobne do tego:

SELECT     KasaID, DataCzas, Zmiana, Kasjer, IloscPoz, Brutto
FROM       Paragon
WHERE     
(CONVERT(date, zmiana) BETWEEN '2012-09-01' AND '2012-09-26')
AND 
(CONVERT(time, zmiana) BETWEEN '15:00:00.0' AND '20:00:00.0')

Dla wygody mozesz takze utworzyc sobie funkcje DATE i TIME - zaoszczedzi Ci to pisania w przyszlosci.

Ciekaw jestem czy zapytanie dziala poprawnie. Daj znac jakby co

0
tk napisał(a):

Uzylem tych nawiasow kwadratowych po to aby podkreslic, ze sa to dane ktore musisz sobie uzupelnic - zapytanie nie powinno ich zawierac.

Jest jednak inny problem: wyglada na to, ze w dialekcie MSSQL nie ma funkcji DATE i TIME. Przegladajac na szybko internet doszedlem do wniosku ze mozna je zastapic funkcja CONVERT. Mozesz wiec sprobowac wyslac zapytanie podobne do tego:

SELECT     KasaID, DataCzas, Zmiana, Kasjer, IloscPoz, Brutto
FROM       Paragon
WHERE     
(CONVERT(date, zmiana) BETWEEN '2012-09-01' AND '2012-09-26')
AND 
(CONVERT(time, zmiana) BETWEEN '15:00:00.0' AND '20:00:00.0')

Dla wygody mozesz takze utworzyc sobie funkcje DATE i TIME - zaoszczedzi Ci to pisania w przyszlosci.

Ciekaw jestem czy zapytanie dziala poprawnie. Daj znac jakby co

tak działa idealnie od daty do daty i od godziny do godziny z minutami :) wielkie dzięki za pomoc
ja w wolnej chwili też coś wykombinowałem i też zadziałało :

select dataczas, zmiana, brutto from sklep_fabryczna.dbo.paragon
WHERE DataCzas BETWEEN '2012-09-01' AND '2012-09-26'
AND CAST(dataczas AS TIME) BETWEEN '1900' AND '2100'

0

Nie ma sprawy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1