Forum » Programiranje » SQL CNVERT; konvertanje datuma
SQL CNVERT; konvertanje datuma
Microsoft ::
Datum konvertam takole:
CONVERT(NVARCHAR(255), [Narocilo].[DateAndTime], 104)
Pri tem pa nastane majcken problemcek. Danasnji datum je predstavljen kot 6.02.2006. Jst bi se rad znebil tistih "sledecih" 0, tako da bi danasnji mesec bil predstavljen z 2 in ne z 02. Nasel sem nekaj formatov, samo nisem pa se nasel, kako se teh vodilnih nicel znebit. Anyone?
by Miha
CONVERT(NVARCHAR(255), [Narocilo].[DateAndTime], 104)
Pri tem pa nastane majcken problemcek. Danasnji datum je predstavljen kot 6.02.2006. Jst bi se rad znebil tistih "sledecih" 0, tako da bi danasnji mesec bil predstavljen z 2 in ne z 02. Nasel sem nekaj formatov, samo nisem pa se nasel, kako se teh vodilnih nicel znebit. Anyone?
by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr
- spremenil: Microsoft ()
NavadniNimda ::
-- Evo za danasnji dan:
print convert (varchar(32),
cast (day (getdate ()) as varchar (2)) + '.' +
cast (month (getdate ()) as varchar (2)) + '.' +
cast (year (getdate ()) as varchar (4)))
print convert (varchar(32),
cast (day (getdate ()) as varchar (2)) + '.' +
cast (month (getdate ()) as varchar (2)) + '.' +
cast (year (getdate ()) as varchar (4)))
Microsoft ::
Totalno kul. Sem cisto spregledal tiste funkcije DAY, MONTH in YEAR. Totalno tnx.
by Miha
by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr
NavadniNimda ::
Pa glej, da ne uporabiš nikoli getdate () ali katerekoli druge non-deterministic funkcije na način, ko sem jaz gor v primeru - lahko pride do grdih stranskih efektov.
Microsoft ::
Kaki stranski efekti to?
Sicer mam pa takole:
WHERE
(
CAST(DAY([Narocilo].[DateAndTime]) AS NVARCHAR(2)) + '.' +
CAST(MONTH([Narocilo].[DateAndTime]) AS NVARCHAR(2)) + '.' +
CAST(YEAR([Narocilo].[DateAndTime]) AS NVARCHAR(4))
) LIKE @search
by Miha
Sicer mam pa takole:
WHERE
(
CAST(DAY([Narocilo].[DateAndTime]) AS NVARCHAR(2)) + '.' +
CAST(MONTH([Narocilo].[DateAndTime]) AS NVARCHAR(2)) + '.' +
CAST(YEAR([Narocilo].[DateAndTime]) AS NVARCHAR(4))
) LIKE @search
by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr
NavadniNimda ::
Ti imaš to povsem v redu, ker gre za stolpec iz nekega querya. V mojem primeru pa ni bilo. Predstavljaj si, da smo 31.1.2006 in izračuna DAY (getdate()) ko gre pa pretvarjat MONTH (getdate ()) (kar bi vrnilo 1.2.2006) pa pade že na februar. Torej dobim ven izpisano 31.2.2006, kar je seveda bullshit. Takim funkcijam, ki vsakič vrnejo drug rezultat se reče "non-deterministic". Ugodno je vzet lokalno spremenljivko in ji priredit vrednost getdate () in potem z njo telovadit po expressionih.
Zgodovina sprememb…
- spremenilo: NavadniNimda ()
MasterBlaster ::
Zakaj tako kompliciraš? Dobiti vse zadetke tekočega datuma je najlažje:
WHERE DATEDIFF(d, [Narocilo].[DateAndTime], @search) = 0
S tem, da v @search vpišeš datum v formatu YYYYMMDDhhmmss ali YYYY-MM-DDThh:mm:ss (pazi na T!). Ta dva formata sta standardna, in ju sqlserver prepozna neglede na regionalne nastavitve.
WHERE DATEDIFF(d, [Narocilo].[DateAndTime], @search) = 0
S tem, da v @search vpišeš datum v formatu YYYYMMDDhhmmss ali YYYY-MM-DDThh:mm:ss (pazi na T!). Ta dva formata sta standardna, in ju sqlserver prepozna neglede na regionalne nastavitve.
Tk je pa pika .
Microsoft ::
Prikaz formata imam pac tak, kot je pri nas: 8.2.2006 13:51:10. Ce pa ne bi "kompliciral", pa se vneseni datum primerja z datumom Feb 8 2006 1:51PM.
by Miha
by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr
BigWhale ::
Razmisli, ce ni morda bolj smiselno, da ti datum oblikuje client. Baza pa vedno eno in isto stvar vraca.
MasterBlaster ::
Če je polje tipa DateTime je važno le da SQL Server zna pravilno sparsati datum. Če uporabiš format 20060208155100 ali 2005-02-08T15:51:00, bo server vedno rimerjal s pravo vrednostjo.
Tk je pa pika .
Microsoft ::
V tabeli v bazi je vrednost zapisana lepo "po slovensko"; torej 20.10.2010 10:20:12. Ampak, nastal je problem, ko sem v WHERE primerjal vneseno z tistim, kar je v tabeli. Tu mi je iz tabele prebralo datum in ga skonvertalo v nek us/uk zapis.
by Miha
by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr
BigWhale ::
Eh, iz baze sigurno lahko dobis unix time... tisto primerjat med seboj je trivialno. Ker je vse skupaj en long.
MasterBlaster ::
SQL Server shranjuje datume kot dva štiri bytena integerja. Prvi integer predstavlja št dni od 1.1.1900, drugi pa čas ko št. milisekund od polnoči. Ta datum se potem parsa/konvertira v string. Interno pa baza dela z integerji.
Tk je pa pika .
frudi ::
če je datum shranjen kot podatkovni tip datetime, potem ni zapisan na 'naš' ali pa 'ameriški' način... datum je univerzalen, samo njegov prikaz je stvar izbire formata.
edini problem, ki ga še lahko imaš, je da sql server od vhodnih datumov pričakuje obliko mdy, ne pa našega dmy, kar pa se tudi da spremeniti. uporabi ukaz SET DATEFORMAT [format], kjer je [format] ymd, mdy, dmy... ta ukaz je connection specific, tako da ne vpliva na globalno obnašanje sql serverja.
v skrajnem primeru, pa naredi funkcijo, ki vhodni datum pretvori v pravi format (mdy), ne pa da pretvarjaš datume iz tabele! zakaj bi pretvarjal potencialno tisoče ali miljone datumov, če lahko samo enega?
ampak daleč najhitreje je vhodni datum pretvorit v podatkovni tip datetime in enostavno uporabiti DATEDIFF, =, BETWEEN ali drugi operator po potrebi...
edini problem, ki ga še lahko imaš, je da sql server od vhodnih datumov pričakuje obliko mdy, ne pa našega dmy, kar pa se tudi da spremeniti. uporabi ukaz SET DATEFORMAT [format], kjer je [format] ymd, mdy, dmy... ta ukaz je connection specific, tako da ne vpliva na globalno obnašanje sql serverja.
v skrajnem primeru, pa naredi funkcijo, ki vhodni datum pretvori v pravi format (mdy), ne pa da pretvarjaš datume iz tabele! zakaj bi pretvarjal potencialno tisoče ali miljone datumov, če lahko samo enega?
ampak daleč najhitreje je vhodni datum pretvorit v podatkovni tip datetime in enostavno uporabiti DATEDIFF, =, BETWEEN ali drugi operator po potrebi...
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Postavitev mySQLOddelek: Programiranje | 2227 (1805) | M01O |
» | SQL vprasanje (strani: 1 2 )Oddelek: Programiranje | 8345 (5024) | BivšiUser2 |
» | [PHP]Timestamp in mysqlOddelek: Programiranje | 2354 (2019) | 680x0 |
» | SQL vprašanjeOddelek: Izdelava spletišč | 2666 (2229) | jerneju |
» | SQL Server in datum nagajataOddelek: Programiranje | 1881 (1744) | dudi |