如何将日期整数转换为日期类型?(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'))