miesiąc + 1 dzień

0

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'''

0

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
0

Tak kolego mój błąd chodzi o raport z całego dnia a nie miesiąca.Jutro sprawdzę i odpowiem.

0

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.

0

co to znaczy pierwszą godzinę dnia następnego? Podaj na przykładzie

0

titlescreenshot-20180321170728.png

Dzień 2018-03-18 23;00:00 plus 2018-03-19 00;00:00 potrzebne do raportu dziennego.

0

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ć.

0

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

0

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?

0

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 .

0
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))

0

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

0

Użyj between jak podawałem w moim 1 poście

0

Dziękuje za pomoc i cierpliwość.

0

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))
0

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...

0

Składnie rozumiem tylko nie mogę połączyć tych wyrażeń między AND

0

Bo się nie da... Potrzebujesz 2 warunków between w alternatywie (OR)

0

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.

0

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))
0

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?.

1

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?

0

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.

1

Bo tak się nie da...

where CAST(@rok+@miesiac+@dzien AS datetime) + CAST(Time AS DATETIME) between ...
0

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))
0

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))

0

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.

0

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.

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