在 SQL 中将日期 INT 转换为 DATE

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)

Dai*_*Dai 5

(如果它是一个专栏,请阅读下面的答案int

假设它是一个文本字符串:

假设这是datadate一个字符串(字符、文本等)列而不是date///列,则使用该datetime函数与. 该值对应于 ISO 8601,因为这些值是按顺序排列的,即使它们缺少破折号。datetime2datetimeoffsetCONVERTstyle: 2323yyyy-MM-dd

此页面有数字参考stylehttps://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列:

快速而肮脏的方法是将 转换intvarchar,然后使用与上面相同的代码,就好像它是文本字段一样 - 但不要这样做,因为它很慢:

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)