[英]SQL (Snowflake): Can I use a virtual column to make another virtual column? If not, what's the workaround?
所以,我有兩列是 unix/epoch 格式(以毫秒為單位)。 我相應地轉換它們:
dateadd(S, TIME_START/1000, '1970-01-01') AS J_Start,
dateadd(S, TIME_END/1000, '1970-01-01') AS J_End,
我想要另一個帶有差異的列。 但是,當我嘗試執行 J_Start - J_End 時,我得到一個無效的標識符錯誤。 有沒有辦法解決? 我也嘗試過相互減去完整的轉換語法,但無濟於事......
我正在考慮創建一個虛擬表,然后將其加入原始表,但我仍然會遇到上述問題:Generating a virtual column from other, pre-existing one(s)
這個對我有用:
select 5 as a, 1 as b, a-b as c;
+---+---+---+
| A | B | C |
|---+---+---|
| 5 | 1 | 4 |
+---+---+---+
除非我沒有完全理解這個問題。
如果您的完整查詢帶有確切的錯誤消息,它會有所幫助。
您可以使用datediff
獲取差異。 我以天為單位計算差異,但您可以根據需要更改它。 雙引號不是錯誤的原因,但您並不需要它們。 只需使用不與保留關鍵字沖突的列名。
select datediff(day, dateadd(S, j_start/1000, '1970-01-01'),dateadd(S, j_end/1000, '1970-01-01'))
您也可以使用簡單的減法,但您必須先將 dateadd 的dateadd
為date
。 上面那個更容易維護和修改
select dateadd(S, j_start/1000, '1970-01-01')::date - dateadd(S, j_end/1000, '1970-01-01')::date
如果你真的想在同一個 select 中重用列別名,我不喜歡,你可以這樣做
select dateadd(S, j_start/1000, '1970-01-01')::date as j_start,
dateadd(S, j_end/1000, '1970-01-01')::date as j_end,
b-a as diff_days
話雖如此,如果您只需要以毫秒表示的兩個日期之間的差異,那么使用 1970 還是 1800 都沒有關系。只要做
select floor((time_end-time_start) / (1000 * 60 * 60 * 24)) as diff_days
在雪花中,您可以在其他部分中引用 SELECT 部分的命名 object,並且解析最“明白你的意思”,因此在雪花中:
SELECT
'2021-12-16' AS date_string,
to_date(date_string) as datetime_a,
dateadd('day', 1, date_time_a) AS a_day_later,
date_diff('hours', datetime_a, a_day_later);
很好,並且會給出以下結果:
"2021-12-16", 2021-12-16, 2021-12-17, 24
因此,在 SQL 中,我就您的位置問題給了您,我指的是剛剛宣布的事情。
您看到的錯誤是不支持減去日期的事實,因為您想要答案的格式是什么? 因此使用date_diff
我們可以使用現有的列別名並構建一些計算。下面是使用您的 var 的示例:
select
to_timestamp('2021-01-01T00:00:00')::timestamp as "J_Start" ,to_timestamp('2021-02-01T00:00:00')::timestamp as "J_end",
date_part(epoch_second, "J_Start") as "Epcoh_JSTART",
date_part(epoch_second, "J_end") as "Epcoh_JEND",
"Epcoh_JSTART" - "Epcoh_JEND";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.