微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VARCHAR 为太平洋标准时间 2013 年 1 月 30 日 09:20:00迄今为止在 SQL 中的隐蔽 Varchar

如何解决VARCHAR 为太平洋标准时间 2013 年 1 月 30 日 09:20:00迄今为止在 SQL 中的隐蔽 Varchar

select * 
from table1 
where Month(date) = '05' 
  and Year(date) = '2021'

此处 date 列的数据类型是 varchar 作为示例值(太平洋标准时间 2013 年 1 月 30 日 09:20:00)。

谁能帮我在 sql Server 中将此 varchar 转换为 datetimedate

解决方法

正如我所提到的,问题在于您的设计。您将日期和时间值存储为 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';

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。