az internet sem jó mindenre
körbenéztem a neten - lustaság fél egészség -, hátha találok kész megoldást arra, hogy mit kell csinálni, ha egy dátum-idő (datetime) értékből csak a dátumra vagyok kíváncsi, az idő irreleváns.
a google toplistáján számtalan szebbnél szebb verzió van, arra az egy közös alapra kihegyezve, hogy az értéket szöveggé konvertálják, annak veszik a balsó n karakterét, majd ezt visszakonvertálják dátum-idő értékké - amely folyamatban n pozitív, egész szám és úgy érdemes meghatározni, hogy a szöveggé alakított értékből pont az órákat, perceket és másodperceket vágja le.
ez akár működhet is, feltételezve, hogy a szerveren soha, senki nem változtat beállításokat és az alkalmazást nem portolják más nyelvi/kulturális közegbe.
hogy csak a felszínt kapargassuk, létezik ugye short date format, long date format, utóbbiban léteznek párszáz féle nyelven leírott hónapnevek, léteznek eltérő szokások a y-m-d, m-d-y, d-m-y sorrendet illetően, léteznek különféle szeparátor kerekterek, és egyéni szokások arra vonatkozólag, hogy a szeparátor után köll-e szóköz vagy sem, meg úgy általában, ami perverziót csak el lehet képzelni, az előbb-utóbb fel is bukkan.
nagyon nem mindegy tehát, hogy n pontosan mennyi. dátumot sztringben kezelni egy pain in the ass.
mondjuk egy amerikában a fenti módszerrel megírt alkalmazás magyarországra hozva elég szép eséllyen döglik meg, és ha az egész nem is egy Y2K méretű probléma, de azért adatvesztésnek elég csinos lehet. szegény ördögök nyilván soha nem hallottak még arról, hogy a dátum-idő értékek minden épkézláb rendszerben számként vannak kezelve, unixokban a másodperceket számláló egészként, microsoft-közeli rendszerekben meg olyan floating point-ként, ahol az tizedespont előtti értékek a napok, az utániak meg a napon belüli időpont.
utóbbira adok egy tiszta megoldást. haladóbbak a begin és end közötti részt a @r elhagyásával egy sorban is megoldhatják.
-- =================================== -- Author: moshi -- Create date: 2008.03.11 -- Description: the name tells it all -- =================================== CREATE FUNCTION [dbo].[dateOnly] (@d DATETIME) RETURNS DATETIME AS BEGIN DECLARE @r REAL SET @r = FLOOR(CONVERT(REAL, @d)) RETURN CONVERT(DATETIME, @r) END
Tags: MS SQL

beleszól