Reputation: 39
I'm trying to do date difference between two dim_ck
fields. If it's < 30
, then I need to set a flag Y
, else N
.
Steps followed:
As it's a dim_ck
, I converted it to Date
from dim_ck
.
There is one value with -3
, so it didn't allow me to convert, so I tried to set a default date to -3
and then was able to convert it to Date
. The below query returns Y
and N
result in Terdata DB, but it's not taking the date difference correctly.
For ex: 1998/07/31 - 2015/10/01 = Y
, it's actually > 30
, so it should return N
. Please help.
Query:
SELECT date_dim_ck,
end_date_dim_ck,
CASE
WHEN( CASE
WHEN date_dim_ck = -3 THEN (To_date('01/01/1753', 'mm/dd/yyyy'))
ELSE Cast(( date_dim_ck - 19000000 ) AS DATE)
END - ( Cast (( end_date_dim_ck - 19000000 ) AS DATE) ) ) < 30
THEN 'Y'
ELSE 'N'
END AS FLAG
FROM table
Upvotes: 0
Views: 12556
Reputation: 60462
#1: You didn't convert SQL Server's DATEDIFF (day, date_dim_ck, end_date_dim_ck)
correctly.
SELECT DATE '1998-07-31' - DATE '2015-10-01'
returns -6217
which is way less than 30 :-)
#2: There's no need for applying TO_DATE
plus a format, Teradata supports Standard SQL date literals, DATE 'YYYY-MM-DD'
.
CASE
WHEN Cast (( end_date_dim_ck - 19000000 ) AS DATE) -
CASE
WHEN date_dim_ck = -3
THEN DATE '1753-01-01'
ELSE Cast(( date_dim_ck - 19000000 ) AS DATE)
END < 30
THEN 'Y'
ELSE 'N'
END AS FLAG
Assuming that 1753-01-01 actually doesn't exist within the data:
CASE
WHEN Cast ((end_date_dim_ck - 19000000 ) AS DATE)
- Cast((NullIf(date_dim_ck,-3) - 19000000 ) AS DATE) < 30
THEN 'Y'
ELSE 'N'
END AS FLAG
Btw, the lowest date Teradat supports is DATE '0001-01-01'
.
Upvotes: 2