我有一个SELECT,它检索ROWS,将DATETIME字段与另一个TABLE的最高可用值进行比较。 两个表具有以下结构
DeletedRecords
- Id (Guid)
- RecordId (Guid)
- TableName (varchar)
- DeletionDate (datetime)
另一个使用以下结构跟踪同步的表
SynchronizationLog
- Id (Guid)
- SynchronizationDate (datetime)
为了获取自上次同步以来已删除的所有RECORDS,我运行以下SELECT:
SELECT
[Id],[RecordId],[TableName],[DeletionDate]
FROM
[DeletedRecords]
WHERE
[TableName] = '[dbo].[Person]'
AND [DeletionDate] >
(SELECT TOP 1 [SynchronizationDate]
FROM [dbo].[SynchronizationLog]
ORDER BY [SynchronizationDate] DESC)
如果我还没有可用的同步,则会出现问题,T-SQL SELECT不返回任何行,而它应该返回所有行,因为没有可用的同步记录。 是否有像COALESCE这样的T-SQL函数可以与DateTime一起使用?
答案 0 :(得分:1)
你的子查询应该是这样的:
SELECT COALESCE(MAX([SynchronizationDate]), '0001-01-01')
FROM [dbo].[SynchronizationLog]
它说:获取最后一个日期,但如果没有记录(或所有值都为NULL),则使用'0001-01-01'日期作为开始日期。
注意'0001-01-01'适用于DATETIME2
,如果您使用旧的DATETIME
数据类型,则应为'1753-01-01'
另请注意(来自https://msdn.microsoft.com/en-us/library/ms187819(v=sql.100).aspx)
使用time,date,datetime2和datetimeoffset数据类型进行新工作。这些类型与SQL标准一致。它们更便携。 time,datetime2和datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。
修改强>
另一种解决方案是使用NOT EXISTS
(如果性能更好或更好,则必须对其进行测试):
SELECT
[Id],[RecordId],[TableName],[DeletionDate]
FROM
[DeletedRecords] DR
WHERE
[TableName] = '[dbo].[Person]'
AND NOT EXISTS (
SELECT 1
FROM [dbo].[SynchronizationLog] SL
WHERE DR.[DeletionDate] <= SL.[SynchronizationDate]
)