在 SQL 中将日期 INT 转换为日期



如何将日期整数转换为日期类型?(20200531至2020年5月31日(

我当前表的数据日期格式为 YYYYMMDD(20200531、20200430 等(

数据日期的数据类型是根据我正在使用的蟾蜍数据点软件的整数。 我相信它使用的是ORACLE sql数据库。

因此,在查询此数据时,我必须键入 where 子句,如下所示。

where datadate = '20200531'

我的目标是将此整数数据日期转换为日期格式 (5/31/2020(,以便我可以将数据日期应用于 where 子句。

喜欢。。

WHERE datadate = dateadd(DD, -1, CAST(getdate() as date))

(请阅读下面的答案,了解它是否是int列(

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

假设datadate是字符串(字符、文本等(列而不是date/datetime/datetime2/datetimeoffset列,则将CONVERT函数与style: 23一起使用。23值对应于ISO 8601,因为这些值是按yyyy-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() )

假设它是一个实际的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() )

假设它是一个实际的int列(更好的答案(:

(我感谢@alain指出我的算术中一个相当严重的错误并提供更好的解决方案(

我们需要使用DATEFROMPARTS并使用 Base-10 算术(乐趣(提取每个组件!

假设我们有一个整数表示格式化日期(恐怖(,例如20200531,那么我们需要使用仅整数算术,这样除法截断而不是舍入 - 所以除以 10000,我们得到2020,然后乘以得到20200000

20200531 /    10000 =>      2020
2020 *    10000 =>  20200000
20200531 - 20200000 =>       531
531 /      100 =>         5
5 *      100 =>       500
531 -      500 =>        31

或:

datadate /    10000 =>      yyyy
yyyy *    10000 =>  yyyy0000
datadate - yyyy0000 =>      MMdd
MMdd /      100 =>        MM
MM *      100 =>      MM00
MMdd -     MM00 =>        dd

。这减少到:

yyyy = ( datadate / 10000 )
MM = ( datadate - ( yyyy * 10000 ) ) / 100
dd = ( ( datadate - ( yyyy * 10000 ) ) - ( ( MM ) * 100 ) )

。可以转换为 T-SQL 标量 UDF:

CREATE FUNCTION dbo.UnhorriblifyDate( @date int )
RETURNS date
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT, INLINE = ON
AS
BEGIN
DECLARE @yyyy int = @date / 10000;
DECLARE @mm   int = ( @date - ( @yyyy * 10000 ) ) / 100;
DECLARE @dd   int = ( ( @date - ( @yyyy * 10000 ) ) - ( ( @mm ) * 100 ) );

DECLARE @result date = DATEFROMPARTS( @yyyy, @mm, @dd );
RETURN @result;
END

或者在查询中:

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;

这个答案假设你正在运行Oracle,正如你的问题中所建议的那样。

如何将日期整数转换为日期类型?(20200531至2020年5月31日(

在 Oracle 中,您可以使用to_date()将字符串转换为数字。如果你给它一个数字,它会在转换它之前隐式地将其转换为字符串。因此,在这两种情况下,您都会执行以下操作:

to_date(datadate, 'yyyymmdd')

我的目标是将此整数数据日期转换为日期格式 (5/31/2020(,以便我可以将数据日期应用于 where 子句。

通常,您希望避免对where谓词中的列应用函数:它效率不高,因为数据库需要先对整个列应用该函数,然后才能进行筛选。如果要筛选截至昨天dateadd,那么我建议您计算昨天的日期并将其设置为与筛选的列相同的格式,以便您可以直接匹配现有列值。

如果您的列是字符串:

where datadatea = to_char(sysdate - 1, 'yyyymmdd')

如果是数字:

where datadatea = to_number(to_char(sysdate - 1, 'yyyymmdd'))

最新更新