【问题标题】:Cast Function to display only the month and day from a datetime投射功能仅显示日期时间的月份和日期
【发布时间】:2015-02-08 02:57:06
【问题描述】:
SELECT 
    DateAdded, 
    Cast(DateAdded AS Date) AS DateAddedV1, 
    Cast(DateAdded AS Time) AS DateTime, 
    SELECT CAST(DateAdded AS Date(mm:dd) AS OrderDate
FROM Products

我是 SQL 的初学者,我试图将 DateAdded 列返回为 OrderDate,只有月份和日期,但我似乎无法正确使用语法。感谢任何人的帮助。

【问题讨论】:

  • 应该注意的是,作为一项规则,您不应该格式化数据以在数据库中显示。这是通常由应用程序处理的任务。这个问题听起来像是基于家庭作业、就业测试或醉酒。
  • 这看起来真的像我目前正在处理的作业问题(OregonTech CST324 DB 类,来自 Murach 的 SQL Server 2012 for devs 书籍):除了第 4 行之外,我写了所有的一些行(甚至相同的列名和表名!),这就是我所坚持的。我会使用 CONVERT,但作业说使用 CAST。

标签: sql sql-server tsql datetime


【解决方案1】:

使用DatePart函数从Datetime类型中提取day和month,

Select Datepart(Month,DateAdded) AS [Month], -- Month(Dateadded)
       Datepart(Day,DateAdded) as [Day], -- Day(Dateadded)
       ..
From   Products

更新:只有使用cast 函数才能提取Month 和Day。如果您想将月份和日期保留在同一列中

    SELECT CONVERT(VARCHAR(2), Month(DateAdded)) + ':'
           + CONVERT(VARCHAR(2), Day(DateAdded)) 
           .....

要获得前导零的使用right 函数并从DateAdded 中提取Time,请使用Convert 函数和108 值

SELECT right('0'+CONVERT(VARCHAR(2), Month(DateAdded)),2) + ':'
       + right('0'+CONVERT(VARCHAR(2), Day(DateAdded)) ,2) as [Mon:Day],
         convert(varchar(10),DateAdded,108) as [Time]
       .........

【讨论】:

  • @ZackSpideyDavidson 他们可能希望你使用CAST(DateAdded as Date) - 我认为没有办法使用CAST 函数来删除年份。此外,使用CAST 作为格式化工具是愚蠢的。
【解决方案2】:

我想我这个学期正在做这个作业。这就是我最终得到的结果,因为它必须使用 CAST 函数来完成:

SELECT DateAdded,
    CAST(DateAdded AS date) AS DateOnly,
    CAST(DateAdded AS time) AS TimeOnly,
    CAST(DateAdded AS varchar(6)) MonthDay
FROM Products;

这是因为 varchar 总是在前 6 个字符中精确地包含月份和日期。所有月份都是 3 个字符(1 月、2 月、3 月、4 月),然后有一个空格,然后是 2 位数的日期,或者 2 个空格和 1 位数的日期。无论哪种方式,它总是最多添加 6 个字符。

【讨论】:

    【解决方案3】:

    您在这里询问日期/时间信息的可见格式。

    • 在 SQ 2012 及更高版本的 MS SQL Server 中,您可以使用 FORMAT() 功能。如果您使用支持此功能的版本,我建议您使用它。请记住,第二个参数是区分大小写的
    • 在所有版本中,您都可以使用CONVERT() 函数,该函数具有 这个语法:

    CONVERT (data_type [(length)], 表达式[, style])

    特别注意 style 参数(一个整数),如果使用 CONVERT,这一点很重要。使用任一方法显示日期/时间信息的一个非常有用的参考是 HERE,下面是一个小例子:

    SQL Fiddle demo

    查询 1:

    SELECT
          FORMAT(SYSDATETIME(), 'MMM dd yyyy')  
        , CONVERT(VARCHAR(11), SYSDATETIME(), 100) -- note length set to (11)
    

    Results:

    |-------------|-------------|
    | Oct 11 2015 | Oct 11 2015 |
    

    【讨论】:

    【解决方案4】:

    您可以使用RTRIM 功能,而不是像 NoDisPlayName 的回答那样进行转换。

    SELECT RIGHT('0' + RTRIM(MONTH(DateAdded)), 2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多