Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

How can I create an indexable formula column that generates the julian integer of another datetime column?

Posted on 2004-10-04
9
Medium Priority
?
831 Views
Last Modified: 2012-06-27
I want to add a formula column that converts a datetime field to it's julian int.  This can be done either by, convert(int, theDate) or dateDiff(day, 0, theDate)

Both of which are deterministic and precise according to SQL Server documentation, however, when I go to add an index on the column Sql Server bombs saying "Cannot create index because the key column 'julian' is non-deterministic or imprecise."

CREATE TABLE dbo.Test1 (
     theDate datetime NULL
    ,julian  AS convert(int, [d], 1)
)

CREATE NONCLUSTERED INDEX IX_Test1  
     ON dbo.Test1 (julian)


So my question is:  "How can I create an indexable formula column that generates the julian integer of another datetime column?"
0
Comment
Question by:mjschehl
  • 5
  • 3
9 Comments
 

Author Comment

by:mjschehl
ID: 12219051
I noticed a typo, the index should be:

CREATE NONCLUSTERED INDEX IX_Test1  
     ON dbo.Test1 (julian)
0
 
LVL 15

Expert Comment

by:justinbillig
ID: 12219094
try this

create table dbo.Test1
(
      theDate datetime null
)

create view dbo.VTest1
(
         select
                 convert(int, [d], 1) as julian
         from
              dbo.Test1
)

CREATE NONCLUSTERED INDEX IX_VTest1  
     ON dbo.VTest1(julian)
0
 
LVL 15

Expert Comment

by:justinbillig
ID: 12219116
err the correct syntax is here

 
create table dbo.Test1
(
    thedate datetime null
)


create view VTest1
as

     select
      convert(int, thedate, 1) as julian
      from
      Test1

CREATE NONCLUSTERED INDEX IX_VTest1  
     ON dbo.VTest1(julian)

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 15

Expert Comment

by:justinbillig
ID: 12219147
http://fox.wikis.com/wc.dll?Wiki~IndexedViews~VFP


is suck ... go there to check out indexing views
0
 

Author Comment

by:mjschehl
ID: 12219234
justinbillig,

There were schema binding problems with this.  If we were to get the schema binding problems resolved, would your solution allow me to index on my main Test1 table?
0
 

Author Comment

by:mjschehl
ID: 12219309
Just to be clear, I truly need the index on the main table.  That is the only way I believe I can eek the performance out that I need.  

I only need this index for a short time to convert the data to a new db schema.   The real table already has a long record length and 300 million records.  So, I am avoiding copying the data into a new table-- or materialized view.  Also, I am avoiding adding a new column.
0
 

Author Comment

by:mjschehl
ID: 12220418


I came up with a work-around.

I wrote the following formula which calculates the Julian date.  The formula works correctly for dates starting at jan 1, 1900, and more importantly, Sql Server doesn't have a problem with it:

((datepart(year,[theDate]) - 1900) * 365 + floor(((datepart(year,[theDate]) - 1901) / 4)) + datepart(dayofyear,[theDate]) - 1)
0
 
LVL 9

Accepted Solution

by:
miron earned 1100 total points
ID: 12222425
this works:

set QUOTED_IDENTIFIER on
go
set ARITHABORT on
go
create table dt( c1 datetime , c2 as cast( floor( convert( numeric( 35, 17) , c1 , 121 ) ) as int )  )
go
create index ix__c2__dt on dt( c2 )
go
set QUOTED_IDENTIFIER off
go
set ARITHABORT off
go
0
 

Author Comment

by:mjschehl
ID: 12225919

Good work Miron.  I wish Microsoft's products actually worked as expected.  But until then, I guess I should be happy that sometimes there are work-a-rounds!

0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Recently we ran in to an issue while running some SQL jobs where we were trying to process the cubes.  We got an error saying failure stating 'NT SERVICE\SQLSERVERAGENT does not have access to Analysis Services. So this is a way to automate that wit…
Microsoft Access has a limit of 255 columns in a single table; SQL Server allows tables with over 255 columns, but reading that data is not necessarily simple.  The final solution for this task involved creating a custom text parser and then reading…
Via a live example, show how to setup several different housekeeping processes for a SQL Server.
Viewers will learn how to use the UPDATE and DELETE statements to change or remove existing data from their tables. Make a table: Update a specific column given a specific row using the UPDATE statement: Remove a set of values using the DELETE s…
Suggested Courses

571 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question