如何对sql中每个日期的数据进行分类?
How to categorize data for each date in sql?
我正在使用 Oracle sql developer.And 我必须将一些数据从 table.
分类到每个 Date
我使用 TO_CHAR
函数更改日期格式。
select to_char(txn_date, 'dd-mon-rrrr') my_day, some_coloums
from mwt_wallet_transactions
order by my_day;
上一个没问题。但我想在给定的日期得到它:
select to_char( txn_date, 'dd-mon-rrrr') my_day, some_coloums
from mwt_wallet_transactions
where my_day like '08-feb-2015'
order by my_day;
我在网上搜索了这个,大多数人要求像这样使用CONVERT
函数:
select convert (VARCHAR(10), txn_date , 23 ) my_day, some_colomns
from mwt_wallet_transactions
where my_day like '08-feb-2015'
order by my_day;
但这对我不起作用。帮我解决这个问题!
您不能在 WHERE
子句中使用 select 列表列别名。使用派生table访问它:
select * from
(
select *some_computed_value* as my_day, some_colomns
from mwt_wallet_transaction
)
where *my_day conditions*
order by my_day
where my_day like '08-feb-2015'
我认为您对 SELECTION 和 FILTER PREDICATE 感到困惑。
此外,请记住,''08-feb-2015'
不是 DATE,它是 string.
您想根据 DATE 值过滤行。因此,将文字转换为 R.H.S。使用 TO_DATE
进入 DATE 或使用 ANSI Date literal 如果你没有时间部分。
现在,请记住,DATE 包含日期和时间元素,因此您需要 -
- 要么在日期列上使用
TRUNC
来摆脱时间元素
- 或者,使用 DATE 范围条件 以获得更好的性能,因为它会使用任何 常规索引 在日期栏上。
我假设 my_day
作为日期列。修改过滤器为:
使用 ANSI 日期文字:固定格式 'YYYY-MM-DD'
where my_day >= DATE '2015-02-08' and my_day < DATE '2015-02-09'
或者,TO_DATE
具有适当的 格式模型 。请记住,TO_DATE
是 NLS 依赖的,所以我使用 NLS_DATE_LANGUAGE
使其独立于 NLS。
WHERE my_day >= TO_DATE('08-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american')
AND my_day < TO_DATE('09-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american')
以上。 my_day
被假定为静态日期列,而不是列别名。
我的解决方案:
我检查了这个解决方案,它运行良好,
select * from
(select cast( TRUNC(txn_date) as date) my_day ,some_columns
from mwt_wallet_transactions
)
where my_day = '08-FEB-15'
order by my_day
;
或者我们可以使用:
select * from
(select to_char( txn_date, 'dd-mon-rrrr') my_day
from mwt_wallet_transactions
)
where my_day = '08-feb-2015'
order by my_day;
我正在使用 Oracle sql developer.And 我必须将一些数据从 table.
分类到每个Date
我使用 TO_CHAR
函数更改日期格式。
select to_char(txn_date, 'dd-mon-rrrr') my_day, some_coloums
from mwt_wallet_transactions
order by my_day;
上一个没问题。但我想在给定的日期得到它:
select to_char( txn_date, 'dd-mon-rrrr') my_day, some_coloums
from mwt_wallet_transactions
where my_day like '08-feb-2015'
order by my_day;
我在网上搜索了这个,大多数人要求像这样使用CONVERT
函数:
select convert (VARCHAR(10), txn_date , 23 ) my_day, some_colomns
from mwt_wallet_transactions
where my_day like '08-feb-2015'
order by my_day;
但这对我不起作用。帮我解决这个问题!
您不能在 WHERE
子句中使用 select 列表列别名。使用派生table访问它:
select * from
(
select *some_computed_value* as my_day, some_colomns
from mwt_wallet_transaction
)
where *my_day conditions*
order by my_day
where my_day like '08-feb-2015'
我认为您对 SELECTION 和 FILTER PREDICATE 感到困惑。
此外,请记住,''08-feb-2015'
不是 DATE,它是 string.
您想根据 DATE 值过滤行。因此,将文字转换为 R.H.S。使用 TO_DATE
进入 DATE 或使用 ANSI Date literal 如果你没有时间部分。
现在,请记住,DATE 包含日期和时间元素,因此您需要 -
- 要么在日期列上使用
TRUNC
来摆脱时间元素 - 或者,使用 DATE 范围条件 以获得更好的性能,因为它会使用任何 常规索引 在日期栏上。
我假设 my_day
作为日期列。修改过滤器为:
使用 ANSI 日期文字:固定格式 'YYYY-MM-DD'
where my_day >= DATE '2015-02-08' and my_day < DATE '2015-02-09'
或者,TO_DATE
具有适当的 格式模型 。请记住,TO_DATE
是 NLS 依赖的,所以我使用 NLS_DATE_LANGUAGE
使其独立于 NLS。
WHERE my_day >= TO_DATE('08-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american')
AND my_day < TO_DATE('09-feb-2015','dd-mon-yyyy','NLS_DATE_LANGUAGE=american')
以上。 my_day
被假定为静态日期列,而不是列别名。
我的解决方案:
我检查了这个解决方案,它运行良好,
select * from
(select cast( TRUNC(txn_date) as date) my_day ,some_columns
from mwt_wallet_transactions
)
where my_day = '08-FEB-15'
order by my_day
;
或者我们可以使用:
select * from
(select to_char( txn_date, 'dd-mon-rrrr') my_day
from mwt_wallet_transactions
)
where my_day = '08-feb-2015'
order by my_day;