正如我所提到的,问题在于您的设计。您将日期和时间值存储为varchar;一个严重的错误。修复您的设计解决问题。 假设你所有的值都是hh:mm:ss MMM dd, yyyy tz的格式,并且时区很重要,你可以这样做:
ALTER TABLE dbo.YourTable ADD NewDate datetimeoffset(0);
GO
CREATE TABLE #TimeZones (Timezone varchar(4),
Offset varchar(6));
--You need to create the rest of the timezones, these are examples
INSERT INTO #TimeZones
VALUES('PST','-08:00'),
('PDT','-07:00'),
('GMT','+00:00'),
('BST','+01:00'),
('CET','+01:00'),
('CEST','+02:00');
GO
UPDATE YT
SET NewDate = TRY_CONVERT(datetimeoffset(0),CONCAT(S.FormattedDateString,TZ.Offset))
FROM dbo.YourTable YT
CROSS APPLY (VALUES(REPLACE(SUBSTRING(YT.[date],10,13) + LEFT(YT.[date],9),',',''),(RIGHT(YT.[date],CHARINDEX(' ',REVERSE(YT.[date]))-1))))S(FormattedDateString,TimeZone)
JOIN #TimeZones TZ ON S.TimeZone = TZ.TimeZone;
GO
DROP TABLE #Timezones;
GO
EXEC sys.sp_rename N'dbo.YourTable.Date',N'OldStringDate','COLUMN';
GO
EXEC sys.sp_rename N'dbo.YourTable.NewDate',N'Date','COLUMN';
GO
然后原始值将位于 OldStringDate 中,因此您可以使用以下内容获取未转换的值列表:
SELECT OldStringDate
FROM dbo.YourTable
WHERE OldStringDate IS NOT NULL
AND [Date] IS NULL;
然后您可以使用以下命令轻松地从表中获取数据:
SELECT *
FROM dbo.YourTable
WHERE [Date] >= '2021-05-01T00:00:00-08:00'
AND [Date] < '2021-06-01T00:00:00-08:00';