Witam.
Mam pytanie czy do takowej procedury która wybiera zakres 1 doby można dopisać aby pobierała także następną pierwszą godzinę 00:00 następnego dnia.
''' ALTER proc [dbo].[DaneDzien]
@rok nvarchar(4), @miesiac nvarchar(2), @dzien nvarchar(2)
as
select * from
OKF
where date=CAST(@rok+@miesiac+@dzien AS datetime)
order by date asc'''
Jeżeli dobrze rozumiem to dla 20180519 ma zwrócić: 2018-05-20 0000, bo w tytulw spominasz o miesiącu...
ALTER proc [dbo].[DaneDzien]
@rok nvarchar(4), @miesiac nvarchar(2), @dzien nvarchar(2)
as
select * from
OKF
where date between CAST(@rok+@miesiac+@dzien AS datetime) and dateadd(d,1,cast(@rok+@miesiac+@dzien as datetime))
order by date asc
Tak kolego mój błąd chodzi o raport z całego dnia a nie miesiąca.Jutro sprawdzę i odpowiem.
Kod działa poprawnie tylko do szczęścia brakuje mi jeśli w tym kodzie który dodaje następną dobę dodało tylko pierwszą godzinę z dnia następnego o ile to nie jest problem.
co to znaczy pierwszą godzinę dnia następnego? Podaj na przykładzie
Dzień 2018-03-18 23;00:00 plus 2018-03-19 00;00:00 potrzebne do raportu dziennego.
Nie wiem po co dajesz screena zamiast opisac to czego faktycznie potrzebujesz..
dla 2018-03-18 dateadd(d,1,CAST('20180318' AS datetime))
zwróci 2018-03-19 0000.000 czyli chyba to czego oczekujesz. Jeżeli nie to OPISZ dokładnie co dla przekazywanych danych (rok,miesiac,dzień) chcesz otrzymać.
Właśnie dla Twojego przykładu zwracana jest następna cała doba a ja oczekuję:
2018-03-19 0000.000 -------- 2018-03-19 2300.000 plus 2018-03-20 0000.000
Zaczynam tracić cierpliwość... W przykładzie dałem 18 marca, a ty masz w przykladzie 19 i 20. Precyzuj dokładnie, bez dodawania domysłów.
Masz na wejściu rok, miesiąc, dzień, zakładając że
select
@rok=2018
,@miesiac='03'
,@dzien=18
Jaki chcesz otrzymać warunek w WHERE
?
OK ty dałeś 18 a ja 19 przykład a efekt jaki chciałem osiągnąć to dla doby 2018-03-19 powinno być jw.
zaczyna się 2018-03-19 o 0000.000 i kończy się 2018-03-19 o 2300.000 plus pierwsza godzina doby 2018-03-20 0000.000 .
declare @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
select
@rok='2018'
,@miesiac='03'
,@dzien='19'
select
CAST(@rok+@miesiac+@dzien AS datetime)
,dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
,dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime))
,dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 01:00:00' AS datetime))
Ok działa tylko jak będzie w połączeniu z moją:
ALTER proc [dbo].[DaneDzien]
@rok nvarchar(4), @miesiac nvarchar(2), @dzien nvarchar(2)
as
select * from
OKF
where date=CAST(@rok+@miesiac+@dzien AS datetime)
order by date asc
Użyj between jak podawałem w moim 1 poście
Dziękuje za pomoc i cierpliwość.
Jako że jestem laikiem proszę o ponowną pomoc bo nie wychodzi mi wstawienie do mojego przykładu:
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='15'
SELECT*
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE DATE BETWEEN CAST(@rok+@miesiac+@dzien AS datetime)
,dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
,dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime))
,dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 01:00:00' AS datetime))
No to popatrz na mój pierwszy post przeczytaj to: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/between-transact-sql i zastanów się co jest nie tak...
Składnie rozumiem tylko nie mogę połączyć tych wyrażeń między AND
Bo się nie da... Potrzebujesz 2 warunków between w alternatywie (OR)
Niestety przeszukałem dziesiątki stron ale nie znalazłem odpowiedzi na twój przykład. Znalazłem nawet inny kod :
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='16'
SELECT dateadd(dd, datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime))+0, 0),
dateadd(dd, 1+datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime))+0, 0)
który też by mi odpowiadał daje wynik: 2018-03-16 0000.000 / 2018-03-17 0000.000
ale w połączeniu z BETWEEN :
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='16'
SELECT*
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE DATE BETWEEN
dateadd(dd, datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime))+0, 0) AND
dateadd(dd, 1+datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime))+0, 0)
daje wynik 2 doby. Brak już mi pomysłów i wiedzy.
Przecież napisalem Ci ze potrzebujesz dwóch warunków between skoro chcesz dla 15 marca, zakres od 2018-03-15 0000 do 2018-03-15 2300 i 2018-03-16 0000 do 2018-03-16 0100. Ja może się nie znam ale nie znam takiej daty która by jednocześnie do tych 2 przedzialów. Więc tu nie chodzi o sposób wyliczenia daty, a stworzenie odpowiedniego warunku:
WHERE
date between CAST(@rok+@miesiac+@dzien AS datetime) and dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
or
date between dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime)) and dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 01:00:00' AS datetime))
Kolego Panczo to ze napisałeś mi że potrzebuje dwóch warunków between to Ok. Działa i Twój przykład i mój tylko że nie przy mojej tabeli w której wyraźnie widać że data jest w kolumnie obok. Gdyby tabela date była jako datetime to Ok a nią nie jest. Tabela z time jest obok. To niby skąd between ma wiedzieć o którą godzinę pytam?.
Wiesz zapytanie, a w szczególności warunek where nic nie wie tylko wykonuje to co mu nakazuje piszący zapytanie... Co stoi na przeszkodzie, żeby złączyć te dwie kolumny i zrobić z nich datetime?
Połączyłem dwie kolumny poprzez dodatkową kolumnę zdaje się że tymczasową tylko że nie mogę jej dodać do WHERE?
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='16'
SELECT *, RazemDataCzas=CAST(@rok+@miesiac+@dzien AS datetime) + CAST(Time AS DATETIME)
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE RazemDataCzas
BETWEEN
dateadd(dd, datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime) + CAST(Time AS DATETIME))+0, 0) AND
dateadd(dd, 1+datediff(dd, 0, CAST(@rok+@miesiac+@dzien AS datetime)+ CAST(Time AS DATETIME))+0, 0)
Co robię nie tak. Próbowałem jako @RazemDataCzas ale też mam błędy.
Bo tak się nie da...
where CAST(@rok+@miesiac+@dzien AS datetime) + CAST(Time AS DATETIME) between ...
Czy pełny kod powinien tak wyglądać?
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='16'
SELECT *, RazemDataCzas=CAST(@rok+@miesiac+@dzien AS datetime) + CAST(Time AS DATETIME)
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE
CAST(@rok+@miesiac+@dzien AS datetime) + CAST(TIME AS DATETIME) BETWEEN CAST(@rok+@miesiac+@dzien AS datetime) AND dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
OR
CAST(@rok+@miesiac+@dzien AS datetime) + CAST(TIME AS DATETIME) BETWEEN dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime)) AND dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 01:00:00' AS datetime))
Poprzedni kod tworzy tabelę a ten wyświetla wszystkie akordy tak jakby omijało WHERE:
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='17'
SELECT *
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE
CAST(@rok+@miesiac+@dzien AS datetime) + CAST(TIME AS DATETIME) BETWEEN CAST(@rok+@miesiac+@dzien AS datetime) AND dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
OR
CAST(@rok+@miesiac+@dzien AS datetime) + CAST(TIME AS DATETIME) BETWEEN dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime)) AND dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 00:00:00' AS datetime))
Znalazłem rozwiązanie, a jest nim usunięcie po WHERE w CAST(@rok+@miesiac+@dzien AS datetime) na nazwę kolumny date i działa poprawnie:
DECLARE @rok nvarchar(4)
, @miesiac nvarchar(2)
, @dzien nvarchar(2)
SELECT
@rok='2018'
,@miesiac='03'
,@dzien='17'
SELECT *
FROM [TagsDataBase].[dbo].[OS_Raport_d]
WHERE
CAST(date AS datetime) + CAST(TIME AS DATETIME) BETWEEN CAST(@rok+@miesiac+@dzien AS datetime) AND dateadd(hh,23,CAST(@rok+@miesiac+@dzien AS datetime))
OR
CAST(date AS datetime) + CAST(TIME AS DATETIME) BETWEEN dateadd(d,1,CAST(@rok+@miesiac+@dzien AS datetime)) AND dateadd(d,1,CAST(@rok+@miesiac+@dzien+' 00:00:00' AS datetime))
Dziękuję za uwagę i poświęcenie.
Witam.
Aby nie zakładać nowego wątku ponieważ dotyczy tego samego pytanie mam o ten ostatni mój przykład gdzie wyszukuje po dacie całą dobę plus pierwszą godzinę następnej doby godzinę 0000. Wszystko jest dobrze tylko mam błąd jeżeli zapis tej godziny jest opóźniony o 1 sek (0001) to już nie wyszukuje. Pytanie jest takie czy można zrobić tolerancję np. 0-2 sek.