【问题标题】:Selecting only 'month-day time' from Datetime field in SQL (server 2012)从 SQL (server 2012) 中的 Datetime 字段中仅选择“月-日时间”
【发布时间】:2019-01-07 13:08:10
【问题描述】:

我正在考虑在案例陈述中将特定日期更改为不同的日期,但是,我只希望它适用于日期、月份和时间。

例如,我想让案例声明将任何日期更改为 31/12 @ 23:59:00 到 01/01 @ 00:00:00,但除非我编写案例以包括每年在接下来的 40 年里,我无法解决这个问题。

我在英国写这篇文章,日期格式为 dd/mm/yyyy(上例是 12 月 31 日和 1 月 1 日)。

数据库中datetime字段的格式为'datetime': 2019-07-01 13:14:47)。

【问题讨论】:

  • 日期没有格式。您是否使用varchar 来存储您的数据 l?如果是这样,那是你的第一个错误。

标签: sql sql-server datetime sql-server-2012


【解决方案1】:

我不知道您是否希望返回类型为datedatetime。如果是date,你可以这样做:

(case when year(dateadd(minute, 1, datecol)) <> year(datecol)
      then datefromparts(year(datecol) + 1, month(datecol), day(datecol))
      else cast(datecol as date)
 end)

假设datecol 已经是datetime,则datetime 的逻辑类似:

(case when year(dateadd(minute, 1, datecol)) <> year(datecol)
      then datefromparts(year(datecol) + 1, month(datecol), day(datecol))
      else datecol
 end)

【讨论】:

    【解决方案2】:

    如果我理解正确,您想将一年中最后一分钟内的日期四舍五入到下一年。你可以这样做:

    SELECT datecol, CASE
        WHEN MONTH(datecol) = 12 AND DAY(datecol) = 31 AND CAST(datecol AS TIME(3)) >= '23:59:00' THEN CAST(DATEADD(MINUTE, 1, datecol) AS DATE)
        ELSE datecol
    END
    FROM (VALUES
        (CAST('2018-12-31 23:58:59.997' AS DATETIME)),
        (CAST('2018-12-31 23:59:00.000' AS DATETIME)),
        (CAST('2018-12-31 23:59:59.997' AS DATETIME)),
        (CAST('2019-01-01 00:00:00.000' AS DATETIME))
    ) AS v(datecol)
    

    结果:

    2018-12-31 23:58:59.997    2018-12-31 23:58:59.997
    2018-12-31 23:59:00.000    2019-01-01 00:00:00.000
    2018-12-31 23:59:59.997    2019-01-01 00:00:00.000
    2019-01-01 00:00:00.000    2019-01-01 00:00:00.000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2011-08-08
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多