Zimní výprodej C/C++ week
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++
40 % bodů zdarma díky naší Zimní akci!

Diskuze: Filtrování podle času

Aktivity (2)
Avatar
michal Čepelák:7.10.2019 14:28

Potřeboval bych ze záznamu, kde mám časové údaje o uložení vyfiltrovat pouze záznamy, které se dali v jaký koliv den pouze v čase např. mezi 15:00:00 až 20:00:00

Zkusil jsem: Mám datový typ datetime 2019-10-07 10:10:20.000 převedl jsem si ho na varchar conver(varchar, nazev_sloupce, 108) do podoby 10:10:20 a použil jsem

where název_tabulky between '15:00:00' and '20:00:00'

ale to mi nefunguje

Chci docílit: snažím se dosáhnout aby mi to filtrovalo např. za měsíc září každý den, všechny uložené záznamy od 15:00:00 do 20:00:00

Děkuji za rady

 
Odpovědět
7.10.2019 14:28
Avatar
Ondřej Crha
Redaktor
Avatar
Odpovídá na michal Čepelák
Ondřej Crha:7.10.2019 14:44

Můžeš ukázat celý dotaz?

 
Nahoru Odpovědět
7.10.2019 14:44
Avatar
Odpovídá na Ondřej Crha
michal Čepelák:7.10.2019 14:53
SELECT [ID]

      ,convert(varchar,cas,108) [cas]

  FROM [Login]

  where cas between '15:00:00' and '20:00:00'
  order by id desc

sloupec cas je nastavený v databázi jako datetime v databázi tam vidím datum i čas.
potřebuji zjistit kdo se v určitý čas každý den přihlašuje

Editováno 7.10.2019 14:54
 
Nahoru Odpovědět
7.10.2019 14:53
Avatar
Ondřej Crha
Redaktor
Avatar
Ondřej Crha:7.10.2019 14:59
SELECT *
FROM NazevTabulky
WHERE convert(varchar, SloupecSDateTime, 108) BETWEEN '15:00:00' AND '20:00:00'

Takhle funguje bez problémů. Z dotazu jsem nepochopil, jestli máš zkonvertovanou hodnotu v počítaném sloupci, nebo jestli děláš convert až dotazu samotném. Navíc jsem předpokládal, že

where název_tabulky

byl jen překlep, proto jsem chtěl vidět celý dotaz. Tak snad to stačí takhle. Redakci se omlouvám za spam.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
7.10.2019 14:59
Avatar
Odpovídá na Ondřej Crha
michal Čepelák:7.10.2019 15:02

Děkuji funguje

 
Nahoru Odpovědět
7.10.2019 15:02
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na michal Čepelák
Peter Mlich:7.10.2019 15:04

Viz ondrej, tamto neni sql dotaz, ale nejaka sablona sql dotazu, to pomoci sql nespustis. Ale musis to necim preformatovat na sql dotaz. A ten nas prave zajima. Jinak bys to nasel asi googlem. Pro ruzna sql se to zapisuje jinak mssql/mysql/oracle

 
Nahoru Odpovědět
7.10.2019 15:04
Avatar
Odpovídá na Peter Mlich
michal Čepelák:7.10.2019 15:05

ja mám mssql a ve formatu co to napsal Ondřej tak mi to funguje.

 
Nahoru Odpovědět
7.10.2019 15:05
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2019 15:09

Az na to, ze to konvertuje sloupec misto konstanty. Coz je pro WHERE docela znacne zpomaleni. Jakoze to budes blbe indexovat a bude ti to hledat treba 2 minuty misto 10ms

 
Nahoru Odpovědět
7.10.2019 15:09
Avatar
Ondřej Crha
Redaktor
Avatar
Odpovídá na Peter Mlich
Ondřej Crha:7.10.2019 15:30

Zase taková tragédie to nebude. Zkusil jsem si pár testů na tabulce s 12M záznamů a rozdíl je skoro zanedbatelný. Ale pro klid tvé duše doporučuji autorovi vytvořit computed persisted sloupec:

ALTER TABLE [Login] ADD SpocitanyCas AS CONVERT(varchar(8), cas, 108) PERSISTED

A vytvořit si na něm index:

CREATE INDEX IX_Login_SpocitanyCas ON [Login] (SpocitanyCas)
 
Nahoru Odpovědět
7.10.2019 15:30
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Ondřej Crha
Peter Mlich:8.10.2019 8:03

Myslim si, ze nejaky slozitejsi sql dotaz s joiny by mohl delat problemy. A je to skvely napad s tim dalsim sloupcem. Ten cas jsem schvalne prehnal :)

 
Nahoru Odpovědět
8.10.2019 8:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.