【问题标题】:Convert date formatted as numeric without leading 0 for months < 10 to date format t-sql将格式为数字的日期转换为日期格式 t-sql
【发布时间】:2013-08-17 23:38:57
【问题描述】:

有一个日期字段,当月份 >=10 时,我需要将其从 mddyy 或 mmddyy(数字格式)转换为 mmddyy 日期格式。尚未在网上找到任何答案。

【问题讨论】:

    标签: sql-server tsql date format


    【解决方案1】:

    你可以使用FORMAT:-

    FORMAT ( table.myDateColumn, 'd', 'en-US' )
    

    编辑:-

    试试这个:-

    SELECT LTRIM(STR(MONTH(DateColumn)))+'/'+LTRIM(STR(DAY(DateColumn)))+'/'+STR(YEAR(DateColumn),4)
    

    【讨论】:

    • 谢谢 Rahul,但在 MSMS 中,“格式”不是可识别的内置函数名称。
    • 微软管理工作室。谢谢!很抱歉,显然我的意思是在我原来的帖子中说
    • 再次非常感谢您。在我读取 40113 的示例日期中,上面的输出是 10/29/2009,而它应该是 04/01/2013。谢谢你。事实证明这是具有挑战性的!
    • 您想从 mddyy 或 mmddyy 或 mddyy 或 mmddyyyy 转换??
    • 我想将 mddyy(当月份 =10 时)转换为 mmddyyyy。再次感谢!
    【解决方案2】:

    这使它具有我所寻求的一般外观:

    select
    CASE WHEN LEN(CONVERT(varchar(6), datefield)) < 6
    THEN ('0' + LEFT(CONVERT(varchar(6), datefield),1) + '-' +
          SUBSTRING(CONVERT(varchar(6), datefield),2,2) + '-' +
          LEFT(CONVERT(varchar(7), datefield),4))
    ELSE (LEFT(CONVERT(varchar(6), datefield),2) + '-' +
          SUBSTRING(CONVERT(varchar(6), datefield),3,2) + '-' +
         LEFT(CONVERT(varchar(7), datefield),4))
    END as DesiredDate
    

    【讨论】:

    • 要以日期时间格式获取上述内容,只需在 End 之后插入 convert (datetime 在 Case 之前并通过添加 end 来关闭 case),这会将上述内容以 datetime 格式显示。
    【解决方案3】:

    我的上述解决方案在技术上不起作用,也不符合 SQL Server 中 SQL 的系统范围设置 - “两位数年份截止值”。通常,SQL Server 将任何具有 2 位数年份或值为 49 的日期视为 20xx 年或 2049。此后具有 2 位数年份的日期,例如 70 被解释为 19xx (70 -> 1970)。感谢 marc_s 就该主题发表的文章。我的解决方案不需要自定义函数或 SQL Server 设置更改,它确实考虑了一位数和两位数的月份。它是:

    Select
    Convert (datetime, --varchar depending on desired format--
             CASE 
        WHEN         LEN(CONVERT(varchar(6), dt.datefield))     <  6 and
               SUBSTRING(CONVERT(varchar(6), dt.datefield),4,2) <  50
        THEN ('0' + LEFT(CONVERT(varchar(6), dt.datefield),1))  + '-' +
               SUBSTRING(CONVERT(varchar(6), dt.datefield),2,2) + '-' +
             ('20'+RIGHT(CONVERT(varchar(6), dt.datefield),2))
        WHEN         LEN(CONVERT(varchar(6), dt.datefield))     =  6 and
               SUBSTRING(CONVERT(varchar(6), dt.datefield),5,2) <  50
        THEN          (LEFT(CONVERT(varchar(6), dt.datefield),2))  + '-' +
               SUBSTRING(CONVERT(varchar(6), dt.datefield),2,2) + '-' +
             ('20'+RIGHT(CONVERT(varchar(6), dt.datefield),2))
        WHEN         LEN(CONVERT(varchar(6), dt.datefield))     <  6 and
          SUBSTRING(CONVERT(varchar(6), dt.datefield),4,2) >= 50
        THEN ('0' + LEFT(CONVERT(varchar(6), dt.datefield),1))  + '-' +
               SUBSTRING(CONVERT(varchar(6), dt.datefield),5,2) + '-' +
             ('19'+RIGHT(CONVERT(varchar(6), dt.datefield),2)) 
        WHEN         LEN(CONVERT(varchar(6), dt.datefield))     =  6 and
               SUBSTRING(CONVERT(varchar(6), dt.datefield),5,2) >= 50
        THEN       (LEFT(CONVERT(varchar(6), dt.datefield),2))  + '-' +
                    SUBSTRING(CONVERT(varchar(6), dt.datefield),2,2) + '-' +
        ('19'+(LEFT(CONVERT(varchar(7), dt.datefield),2)))
        End) as MaintDate 
    FROM   
    dbo.date_table dt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2017-02-14
      • 2016-12-02
      • 2018-09-21
      • 2013-12-28
      相关资源
      最近更新 更多