» »

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
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr

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

Microsoft ::

Totalno kul. Sem cisto spregledal tiste funkcije DAY, MONTH in YEAR. Totalno tnx.:))


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.:8)

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

Zgodovina sprememb…

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

kopernik ::

+1 za predlog BigWhale-a.

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
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...
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Postavitev mySQL

Oddelek: Programiranje
92246 (1824) M01O
»

SQL vprasanje (strani: 1 2 )

Oddelek: Programiranje
688398 (5077) BivšiUser2
»

[PHP]Timestamp in mysql

Oddelek: Programiranje
82380 (2045) 680x0
»

SQL vprašanje

Oddelek: Izdelava spletišč
302675 (2238) jerneju
»

SQL Server in datum nagajata

Oddelek: Programiranje
91890 (1753) dudi

Več podobnih tem