问题描述
select *
from table1
where Month(date) = '05'
and Year(date) = '2021'
此处 date
列的数据类型是 varchar
作为示例值(太平洋标准时间 2013 年 1 月 30 日 09:20:00)。
谁能帮我在 sql Server 中将此 varchar
转换为 datetime
或 date
?
解决方法
正如我所提到的,问题在于您的设计。您将日期和时间值存储为 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',('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';