Che*_*oke 1 sql oracle date where-clause
如何将日期整数转换为日期类型?(20200531 至 2020 年 5 月 31 日)
我当前的表的数据日期格式为 YYYYMMDD(20200531、20200430 等)
根据我正在使用的 Toad Data Point 软件,数据日期的数据类型是一个 int 。我相信它使用的是 ORACLE sql 数据库。
因此,在查询这些数据时,我必须输入如下的 where 子句。
where datadate = '20200531'
Run Code Online (Sandbox Code Playgroud)
我的目标是将此整数 datadate 转换为日期格式 (5/31/2020),以便我可以将 datadate 应用于 where 子句。
喜欢..
WHERE datadate = dateadd(DD, -1, CAST(getdate() as date))
Run Code Online (Sandbox Code Playgroud)
(如果它是一个专栏,请阅读下面的答案int)
假设这是datadate一个字符串(字符、文本等)列而不是date///列,则使用该datetime函数与. 该值对应于 ISO 8601,因为这些值是按顺序排列的,即使它们缺少破折号。datetime2datetimeoffsetCONVERTstyle: 2323yyyy-MM-dd
此页面有数字参考style:https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql ?view=sql-server-ver15
SELECT
*
FROM
(
SELECT
myTable.*
CONVERT( date, datadate, 23 ) AS valueAsDate
FROM
myTable
) AS q
WHERE
q.valueAsDate = DATEADD( dd, -1, GETDATE() )
Run Code Online (Sandbox Code Playgroud)
int列:快速而肮脏的方法是将 转换int为varchar,然后使用与上面相同的代码,就好像它是文本字段一样 - 但不要这样做,因为它很慢:
SELECT
*
FROM
(
SELECT
myTable.*,
CONVERT( char(8), datadate ) AS valueAsChar,
CONVERT( date, CONVERT( char(8), datadate ), 23 ) AS valueAsDate
FROM
myTable
) AS q
WHERE
q.valueAsDate = DATEADD( dd, -1, GETDATE() )
Run Code Online (Sandbox Code Playgroud)
int列(更好的答案):(我感谢@alain指出我的算术中一个相当严重的错误并提供了更好的解决方案)
我们需要使用DATEFROMPARTSBase-10 算术来使用和提取每个组件(有趣)!
假设我们有一个代表格式化日期的整数(可怕的),那么20200531我们需要使用纯整数算术,这样除法会截断而不是四舍五入- 所以除以 10000,我们得到2020,然后乘回得到20200000:
20200531 / 10000 => 2020
2020 * 10000 => 20200000
20200531 - 20200000 => 531
531 / 100 => 5
5 * 100 => 500
531 - 500 => 31
Run Code Online (Sandbox Code Playgroud)
或者:
datadate / 10000 => yyyy
yyyy * 10000 => yyyy0000
datadate - yyyy0000 => MMdd
MMdd / 100 => MM
MM * 100 => MM00
MMdd - MM00 => dd
Run Code Online (Sandbox Code Playgroud)
...这减少到:
yyyy = ( datadate / 10000 )
MM = ( datadate - ( yyyy * 10000 ) ) / 100
dd = ( ( datadate - ( yyyy * 10000 ) ) - ( ( MM ) * 100 ) )
Run Code Online (Sandbox Code Playgroud)
...可以转换为 T-SQL 标量 UDF:
SELECT
*
FROM
(
SELECT
myTable.*
CONVERT( date, datadate, 23 ) AS valueAsDate
FROM
myTable
) AS q
WHERE
q.valueAsDate = DATEADD( dd, -1, GETDATE() )
Run Code Online (Sandbox Code Playgroud)
或者在查询中:
WITH dateParts AS (
SELECT
c.datadata,
c.yyyy,
c.mm,
( ( c.datadate - ( c.yyyy * 10000 ) ) - ( ( c.MM ) * 100 ) ) AS dd
FROM
(
SELECT
b.datadata,
b.yyyy,
( b.datadate - ( b.yyyy * 10000 ) ) / 100 AS mm
FROM
(
SELECT
a.datadata,
a.datadate / 10000 AS yyyy
FROM
myTable AS a
) AS b
) AS c
)
SELECT
c.datadata,
DATEFROMPARTS( d.yyyy, d.mm, d.dd ) AS valueAsDate
FROM
dateParts AS d;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13603 次 |
| 最近记录: |