VARCHAR 作为 09:20:00 太平洋标准时间 2013 年 1 月 30 日。将 Varchar 转换为 SQL 中的日期
VARCHAR as 09:20:00 Jan 30, 2013 PST. Covert Varchar to date in SQL
select *
from table1
where Month(date) = '05'
and Year(date) = '2021'
此处 date
列的数据类型是 varchar
作为示例值(太平洋标准时间 2013 年 1 月 30 日 09:20:00)。
谁能帮我在 SQL 服务器中将此 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','+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;
然后您可以通过以下方式轻松地从您的 table 获取数据:
SELECT *
FROM dbo.YourTable
WHERE [Date] >= '2021-05-01T00:00:00-08:00'
AND [Date] < '2021-06-01T00:00:00-08:00';
select *
from table1
where Month(date) = '05'
and Year(date) = '2021'
此处 date
列的数据类型是 varchar
作为示例值(太平洋标准时间 2013 年 1 月 30 日 09:20:00)。
谁能帮我在 SQL 服务器中将此 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','+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;
然后您可以通过以下方式轻松地从您的 table 获取数据:
SELECT *
FROM dbo.YourTable
WHERE [Date] >= '2021-05-01T00:00:00-08:00'
AND [Date] < '2021-06-01T00:00:00-08:00';