Sql 执行考虑时区的Where子句

Sql 执行考虑时区的Where子句,sql,sql-server,Sql,Sql Server,我使用的是SQL Server。 假设我有几个记录和datetimeoffset类型的列 record #1 has a datetime with a +03:00 TZ record #2 has a datetime with a +06:00 TZ record #3 has a datetime with a -02:00 TZ 我想显示所有记录,他们的时间已经过去了,给出了该特定记录的TZ。 我的WHERE子句看起来像什么?这对于注释来说太长了,但是,SQL Server已经很好地

我使用的是SQL Server。 假设我有几个记录和datetimeoffset类型的列

record #1 has a datetime with a +03:00 TZ
record #2 has a datetime with a +06:00 TZ
record #3 has a datetime with a -02:00 TZ
我想显示所有记录,他们的时间已经过去了,给出了该特定记录的TZ。
我的WHERE子句看起来像什么?

这对于注释来说太长了,但是,SQL Server已经很好地处理了时区:

USE Sandbox;
GO

CREATE TABLE TestTable (OffsetTime datetimeoffset(0));
GO
--Insert 5 times that are all the same time:
INSERT INTO TestTable
VALUES ('2019-10-15T17:00:00-02:00'),
       ('2019-10-15T18:00:00-01:00'),
       ('2019-10-15T19:00:00+00:00'),
       ('2019-10-15T20:00:00+01:00'),
       ('2019-10-15T21:00:00+02:00');
GO
--All rows
SELECT * 
FROM TestTable;

--All rows
SELECT *
FROM TestTable
WHERE OffsetTime = '2019-10-15T19:00:00+00:00';

--All rows
SELECT *
FROM TestTable
WHERE OffsetTime = '2019-10-15T21:00:00+02:00';
如果在日期和时间中也传递时区,SQL Server将适当地比较这些值

如果出于某种原因,您希望根据相对于位置的时间或日期执行操作,则应添加一个计算列,该列将强制转换为datetime2或日期和时间,具体取决于您想要的内容:

ALTER TABLE TestTable ADD LocalTime AS CONVERT(datetime2(0),OffsetTime) PERSISTED;
GO

SELECT OffsetTime
FROM TestTable
WHERE LocalTime >= '2019-10-15T19:00:00';

GO
DROP TABLE TestTable;

我认为最好的办法是使用case语句创建一个新列,并将所有的datetime放到一个特定的区域datetime。然后可以使用where子句。这会很简单,你可能想看看这里@SeanLange复制没有问题。这是一个理论性的问题。那么你想要一个理论性的答案吗?@SeanLange是的。不要在第一个示例中查找代码集,而是考虑使用不同的时区插入相同的日期时间。然后尝试执行WHERE OffsetTime