我的表中有一个 INT 列。此列以特殊格式存储日期。我正在尝试将该列转换为 DATE 类型。
例如,我们保持'2016-03-14'
为20160314
。
例外情况是,对于每个月的最后一天,我们不存储日期。因此,对于'2016-03-31'
我们存储201603
,我必须考虑是否less than 999999
要查找数字是代表月末还是月中的其他日子。
到目前为止,我有 2 个查询来完成此任务:
查询一:
这都是数学公式。
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(DATEFROMPARTS(@k /100, @k % 100, 1), 0)
, DATEFROMPARTS(@k /10000, (@k / 100) % 100, @k % 100)
)
查询 2: 这个是使用字符串操作。
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(cast(LEFT(@k, 4) + '-' + RIGHT(@k, 2) + '-01' as date), 0)
, cast(LEFT(@k, 4) + '-' + RIGHT(LEFT(@k, 6), 2) + '-' + RIGHT(@k, 2) as date )
) AS DateColumn
我需要在WHERE
子句中做转换公式。就像是:
SELECT K, Dt, Name -- and more fields
FROM tbl
WHERE IIF(K < 999999
, EOMONTH(DATEFROMPARTS(K /100, K % 100, 1), 0)
, DATEFROMPARTS(K /10000, (K / 100) % 100, K % 100)
) < GetDate()
和performance is important
问题:有没有更好的方法来做到这一点?可能是 SQL Server 可以使用我在 K 列上的聚集索引的一种方式。