SQL Server 截至2013年1月30日09:20:00 PST的VARCHAR,

q9yhzks0  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(84)

如何将从贝宝返回的varchar日期时间值转换为C#中的日期时间。
下面是我想要获取的数据的查询,由于varchar数据类型,该查询不受支持。

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

在这里,date列的数据类型是varchar作为样本值(2013年1月30日09:20:00 PST)。
有人能帮我在SQL Server中将此varchar转换为datetimedate吗?

cngwdvgl

cngwdvgl1#

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

相关问题