【问题标题】:How do I covert a number to a date in SQL?如何在 SQL 中将数字转换为日期?
【发布时间】:2020-10-14 17:59:46
【问题描述】:

我有一个名为SECURED 的字段,其日期列为123120040320,实际上是12/31/204/03/20。 我能够将SELECT 区域中的日期转换为:

SELECT LEFT(SECURED, 2) + '/' + replace(replace(SECURED, LEFT(SECURED, 2), ''), 
       RIGHT(SECURED, 2), '') + '/' + RIGHT(SECURED, 2) as 'Modified SECURED as Date' 
WHERE CONVERT(date, SECURED, 101) 
      BETWEEN CONVERT(date, getdate() - 30, 101) 
          AND CONVERT(date, getdate(), 101) 

如何从SECURED 列中提取日期为 30 天前的信息?

它不起作用,仍然将日期视为数字。

【问题讨论】:

  • SQL 本身是一个标准,但供应商倾向于以不同的方式实现它。为了获得最佳支持,您应该告诉我们您正在使用什么数据库管理系统 (DBMS)。例如 MySQL、Oracle、MSSQL 等。
  • Microsoft SQL Server 管理工作室 18
  • 您的第一个查询不会将convert 的数字转换为date,而只是一个看起来更像是典型日期显示的字符串。另外:SQL Server Management Studio (SSMS) 不是数据库,但它可以连接到各种数据库。

标签: sql sql-server tsql date where-clause


【解决方案1】:

您可以使用datefromparts() 将您的字符串转换为日期:

datefromparts(
    concat('20', substring(secured, 5, 2)),
    substring(secured, 1, 2),
    substring(secured, 3, 2)
)

然后您可以根据给定的时间间隔检查它:

datefromparts(
    concat('20', substring(secured, 5, 2)),
    substring(secured, 1, 2),
    substring(secured, 3, 2)
) between dateadd(day -30, cast(getdate() as date)) and cast(getdate() as date)

【讨论】:

  • 唯一的问题是 OP 建议 secured 是一个数字/整数,因此如果没有强制转换,子字符串将无法工作。
  • @h0r53:我推测过,但他们给出了'040320' 的例子:前面的0 使它看起来像一个字符串而不是一个数字。
【解决方案2】:

如果secured是一个字符串,你可以做一点操作和一个简单的cast()

select convert(date, concat('20', right(secured, 2), left(secured, 4))

您可能会发现实际创建一个计算列很方便,因此它始终可用:

alter table t add secured_date as (try_convert(date, concat('20', right(secured, 2), left(secured, 4))

您甚至可以持久化列并创建索引,这样您的查询就会更加高效。

【讨论】:

    【解决方案3】:

    有很多方法可以将 6 位数字 INT 转换为 DATE


    您可以像这样使用LTRIMCAST 进行转换:

    SELECT CAST(RIGHT(LTRIM(123120),2) + LEFT(LTRIM(123120),4) AS DATE)
    

    LTRIMSUBSTRING 一起使用:

    SELECT CAST(SUBSTRING(LTRIM(040320), 5, 2) + SUBSTRING(LTRIM(040320), 1, 4) AS DATE)
    

    使用CONVERT

    SELECT CAST((RIGHT(CONVERT(VARCHAR(6), 123120),2) + 
                  LEFT(CONVERT(VARCHAR(6), 123120),4)) AS DATE)
    

    或者使用CONVERTSUBSTRING

    SELECT CAST(SUBSTRING(CONVERT(VARCHAR(6), 040320), 5, 2) + 
                SUBSTRING(CONVERT(VARCHAR(6), 040320), 1, 4) AS DATE)
    

    使用STR:

    SELECT CAST(RIGHT(STR(123120, 6) ,2) + LEFT(STR(123120, 6) ,4) AS DATE)
    

    或者使用STRSUBSTRING

    SELECT CAST(SUBSTRING(STR(040320, 6), 5, 2) + SUBSTRING(STR(040320, 6), 1, 4) AS DATE)
    

    此转换将按预期格式化日期,但您的日期需要 格式为mmddyy

    标准 EUA(样式 10)DATE 格式(mm-dd-yy)无世纪(yy


    在 cmets 之后编辑:

    • 这个查询的表名是什么?

    • SECURED 字段数据类型是什么? INT? VARCHAR?

    • 您需要转换日期并比较过去 30 天和今天的日期吗?

    • 以下查询解决了您的问题? (将 TABLE_NAME 更改为您的表名)


    SELECT LEFT(SECURED, 2) + '/' + replace(replace(SECURED, LEFT(SECURED, 2), ''), 
           RIGHT(SECURED, 2), '') + '/' + RIGHT(SECURED, 2) as 'Modified SECURED as Date'
           FROM TABLE_NAME
    WHERE CAST(RIGHT(LTRIM(SECURED), 2) + LEFT(LTRIM(SECURED), 4) AS DATE)
          BETWEEN GETDATE() - 30 AND GETDATE()
    

    【讨论】:

    • 123120, 040320 里只是例子。我不知道实际上有多少物品。我想把这些东西拉进去。我不关心 SELECT 日期,而是 WHERE。我需要提取过去 30 天内安全字段具有“日期”的所有项目。因此我试图在 CONVERT(date,getdate()-30,101) 和 CONVERT(date,getdate(),101) 之间做 WHERE CONVERT(date,SECURED,101)
    • @Octomaki 我编辑了答案,这解决了你的问题吗?
    • 不,当从字符串转换日期和/或时间时,我仍然收到转换失败。我需要过去 30 天内日期的所有项目
    • 伙计,只有这些信息才能帮助您。请把日志消息和改进你的问题给可以帮助你的人。我认为您并不清楚您的具体问题。
    猜你喜欢
    • 2021-11-21
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多