【发布时间】:2019-03-28 11:59:05
【问题描述】:
我有一个用于 Oracle 数据库的子查询,但我想对 SQL Server 数据库使用等效查询。
我不知道如何迁移 TO_TIMESTAMP(TO_CHAR(TO_DATE 部分,也不知道如何在 T-SQL 中使用 rownums 来处理。
甚至可以迁移此查询吗?
SELECT 0 run_id,
0 tran_id,
0 sort_id,
' ' tran_type,
10 prod_id,
72 type_id,
1 value,
TO_TIMESTAMP(TO_CHAR(TO_DATE('2016-03-18 00:00:00', 'YYYY.MM.DD HH24:MI:SS') + rownum -1, 'YYYY.MM.DD') || to_char(sw.end_time, 'HH24:MI:SS'), 'YYYY.MM.DD HH24:MI:SS') event_publication,
EXTRACT (YEAR
FROM (TO_DATE('2016-03-18 00:00:00', 'YYYY.MM.DD HH24:MI:SS') + rownum -1)) y,
EXTRACT (MONTH
FROM (TO_DATE('2016-03-18 00:00:00', 'YYYY.MM.DD HH24:MI:SS') + rownum -1)) mo,
EXTRACT (DAY
FROM (TO_DATE('2016-03-18 00:00:00', 'YYYY.MM.DD HH24:MI:SS') + rownum -1)) d,
to_number(to_char (sw.end_time, 'HH24')) h,
to_number(to_char (sw.end_time, 'MI')) mi,
to_number(to_char (sw.end_time, 'SS')) s,
0 ms
FROM all_objects ao,
settlement_win sw,
prod_def pd
WHERE pd.prod_id = 10
AND sw.country = pd.country
AND sw.commodity = pd.commodity
AND rownum <= TO_DATE('2016-03-18 23:59:00', 'YYYY.MM.DD HH24:MI:SS') -TO_DATE('2016-03-18 00:00:00', 'YYYY.MM.DD HH24:MI:SS')+1
【问题讨论】:
-
有可能,是的。
To_Date和To_Char可以翻译成convert,rownum可以是row_number() over(order by...)。 -
要取得成功,您需要了解此语句的作用。一旦你知道了,我建议你把它分解成你可以完成的部分。您不应该只是盲目地用 tsql 函数替换 oracle 函数。 from 子句中的那些旧式连接应该是您的第一个改进。 Rownum 需要做一些工作,因为 where 子句中的用法比较晦涩。
-
@ZoharPeled 是的,我也想过为
To_Date和To_Char转换,但不知道to_timestamp的解决方案 -
@SMor 我对 SQL 有点陌生,但注意到这在某种程度上是过时的代码,我会按照你的想法把它分成几部分
标签: sql sql-server oracle tsql migration