sql - Convert column name to time -
there table table
stores values various intervals of time in given day. day can divided in 24 intervals of hour each or 96 intervals of 15 mins duration each. table
contains following columns
date intervalcount int001 int002 . . int096
i need display values in table in following format based on intervalcount
value time calculated , associated value displayed
sample output
date time intervalcount value 2013-04-11 00:00:00.0000000 96 23.43 2013-04-11 00:15:00.0000000 96 26.91 2013-04-11 00:30:00.0000000 96 28.1999999999 2013-04-11 00:45:00.0000000 96 28.77 2013-04-23 00:00:00.0000000 24 18.3099999999 2013-04-23 01:00:00.0000000 24 20.94
code
select [date], (case when [intervalcount]=96 cast(dateadd(minute,cast(substring([interval],4,3) int)*15, [date]) time) when [intervalcount]=24 cast(dateadd(hour,cast(substring([interval],4,3) int), [date]) time) end) [time], [intervalcount], --24/96 [value] ( select [date], [intervalcount], --24/96 [int001], [int002], [int003], [int004], [int005], [int006], [int007], [int008], [int009], [int010], [int011], [int012], [int013], [int014], [int015], [int016], [int017], [int018], [int019], [int020], [int021], [int022], [int023], [int024], [int025], [int026], [int027], [int028], [int029], [int030], [int031], [int032], [int033], [int034], [int035], [int036], [int037], [int038], [int039], [int040], [int041], [int042], [int043], [int044], [int045], [int046], [int047], [int048], [int049], [int050], [int051], [int052], [int053], [int054], [int055], [int056], [int057], [int058], [int059], [int060], [int061], [int062], [int063], [int064], [int065], [int066], [int067], [int068], [int069], [int070], [int071], [int072], [int073], [int074], [int075], [int076], [int077], [int078], [int079], [int080], [int081], [int082], [int083], [int084], [int085], [int086], [int087], [int088], [int089], [int090], [int091], [int092], [int093], [int094], [int095], [int096] [table] ) [source] unpivot ([value] [interval] in ([int001], [int002], [int003], [int004], [int005], [int006], [int007], [int008], [int009], [int010], [int011], [int012], [int013], [int014], [int015], [int016], [int017], [int018], [int019], [int020], [int021], [int022], [int023], [int024], [int025], [int026], [int027], [int028], [int029], [int030], [int031], [int032], [int033], [int034], [int035], [int036], [int037], [int038], [int039], [int040], [int041], [int042], [int043], [int044], [int045], [int046], [int047], [int048], [int049], [int050], [int051], [int052], [int053], [int054], [int055], [int056], [int057], [int058], [int059], [int060], [int061], [int062], [int063], [int064], [int065], [int066], [int067], [int068], [int069], [int070], [int071], [int072], [int073], [int074], [int075], [int076], [int077], [int078], [int079], [int080], [int081], [int082], [int083], [int084], [int085], [int086], [int087], [int088], [int089], [int090], [int091], [int092], [int093], [int094], [int095], [int096]) ) [unpivot]
i have achieved using unpivot
, displaying time use cast
along substring
. there better way of doing this? part convert intervals time.
edit table design can't changed
is there better way of doing this?
depends on mean better. instance, following expression time
calculation "better" in terms of amount of code:
dateadd( minute, cast(substring([interval],4,3) int) * 1440 / intervalcount, cast('00:00' time) ) [time]
you might find more scalable (in fact, actually scalable): if needed add support for, say, half-hour intervals, need start using intervalcount = 48
data.
at same time, intent may conveyed in less clear way above code. therefore, if 24
, 96
possible values can ever need intervalcount
, not need more flexibility you've got part of code.
Comments
Post a Comment