【问题标题】:VARCHAR as 09:20:00 Jan 30, 2013 PST. Covert Varchar to date in SQLVARCHAR 为太平洋标准时间 2013 年 1 月 30 日 09:20:00。在 SQL 中将 Varchar 转换为日期
【发布时间】:2021-08-04 15:23:43
【问题描述】:
select * 
from table1 
where Month(date) = '05' 
  and Year(date) = '2021'

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

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

【问题讨论】:

  • “这里的数据字段 - 数据类型 varchar” 如果它是 varchar,则根据定义不是日期。修复您的设计;不要将日期和时间值存储为varchar。有 5 种日期(和时间)数据类型可供选择,它们都是无限好选择。对于您的价值,datetimeoffset(0) 似乎合适。
  • 谢谢@Larnu..
  • 您可以使用子字符串来提取日期部分,然后 CAST 作为日期(CAST(SUBSTRING(date, 10, 12) AS date)),但最好更改数据类型,因为@Larnu 建议确保只能存储有效日期在列中。

标签: sql sql-server casting sql-server-2012


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多