如何更新所有行以截断毫秒

时间:2014-03-14 09:43:14

标签: sql sql-server datetime

我有一个查找表,其中一列包含2000到2030之间的每个日期。

问题是这里生成的日期在结尾都有毫秒,例如:

2000-01-01 00:00:00.000
2000-01-02 00:00:00.000
2000-01-03 00:00:00.000
2000-01-04 00:00:00.000

我的数据中的其他日期时间列没有这个,例如:

2011-05-17 13:11:11
2011-05-18 09:39:17
2011-06-15 10:54:09
2011-06-20 10:16:43

http://s15.postimg.org/5jw1q6y2z/2014_03_14_09_47_48_Microsoft_SQL_Server_Managem.png

我认为这可能会导致使用BI工具聚合到月份时出现问题,因此我想更新Calendar_Date列中的所有行(在查找表中),以截断所有行的毫秒数。有人可以就如何做到这一点提供指导吗?

两列的结构: enter image description here enter image description here

提前致谢!

4 个答案:

答案 0 :(得分:1)

update table
set Calendar_Date=convert(datetime,(convert(date,Calendar_Date)))

答案 1 :(得分:1)

我相信你误解了这个问题,不是数据,它似乎是SQL。

让我向您展示一些问题。

SELECT
  a12.Calendar_Year   AS Calendar_Year,
  a11.dt              AS datetime,
  (sum(a11.mc_gross) - sum(a11.mc_fee))   AS WJXBFS1
FROM
  shine_orders   AS a11
JOIN
  Calendar       AS a12
    ON (  CONVERT(DATETIME, CONVERT(VARCHAR(10), a11.dt,            101))
        = CONVERT(DATETIME, CONVERT(VARCHAR(10), a12.Calendar_Date, 101))
        AND a11.dt = a12.Calendar_Date
       )
GROUP BY
  a12.Calendar_Year,
  a11.dt

这是您的查询略有不同的布局,以便我可以识别单个部分。


让我们先看看JOIN ......

ON (  CONVERT(DATETIME, CONVERT(VARCHAR(10), a11.dt,            101))
    = CONVERT(DATETIME, CONVERT(VARCHAR(10), a12.Calendar_Date, 101))

这确实只比较了日期部分。它将两个值都转换为格式为'mm/dd/yyyy'的字符串,然后对它们进行比较。它不被认为是最有效的方式,但它 工作。

    AND a11.dt = a12.Calendar_Date

这似乎是一个流氓的条件。这会将包含时间的值与不包含时间的值进行比较。这将阻止您的加入工作。


现在让我们看一下SELECT和GROUP BY

SELECT
  a12.Calendar_Year   AS Calendar_Year,
  a11.dt              AS datetime,

GROUP BY
  a12.Calendar_Year,
  a11.dt

a11.dt,实际上是数据的值,而不是日历表。这意味着您不是按天分组,而是按数据中存在的the exact day and time进行分组。


我建议使用以下查询。

SELECT
  a12.Calendar_Year   AS Calendar_Year,
  a12.Calendar_Date   AS Calendar_Date,
  (sum(a11.mc_gross) - sum(a11.mc_fee))   AS WJXBFS1
FROM
  Calendar       AS a12
LEFT JOIN
  shine_orders   AS a11
    ON  a11.dt >= a12.Calendar_Date
    AND a11.dt <  a12.Calendar_Date + 1
WHERE
      a12.Calendar_Date >= '2013-01-01'
  AND a12.Calendar_Date <  '2014-01-01'
GROUP BY
  a12.Calendar_Year,
  a12.Calendar_Date

编辑: 我最初在最终查询中错过了+ 1

答案 2 :(得分:0)

当你说DATETIME数据类型时,它意味着sql server会将值存储为两个二进制数;一个代表天数(日期),另一个代表刻度数(时间),数据显示为'YYYY-MM-DD hh:mm:ss.000'。如果它以其他任何方式存储,那么它不是日期时间。

要以所需格式'YYYY-MM-DD hh:mm:ss'存储日期时间值,您需要将它们存储为字符串作为varchar值。

但问题是?是不是真的值得吗 ?答案是NOOOOOO ......

原因

1)如果您想以'YYYY-MM-DD hh:mm:ss'格式呈现数据,您可以在朗姆酒时间执行此操作,编写将以此格式显示数据的查询。

2)如果您已将值保存为字符串,则需要先将它们转换为日期时间,然后才能使用任何日期时间函数。

3)由于这些只是字符串而不是日期时间,如果你没有适当的约束,用户可以添加错误的数据,如2013-15-15。和SQL Server将接受它作为有效的字符串。

然后列表继续。这就是为什么我建议保留额外的零,不要担心他们。

<强>更新

您的当前列可能位于SMALLDATETIME数据类型不在日期时间内。

试试这个......

CREATE TABLE Test_Table(Col1 SMALLDATETIME, Col2 DATETIME)
GO

INSERT INTO Test_Table
VALUES 
(GETDATE()-1,GETDATE()-1),(GETDATE()-2,GETDATE()-2),(GETDATE()-3,GETDATE()-3)

SELECT * FROM Test_Table

结果集

╔═════════════════════╦═════════════════════════╗
║        Col1         ║          Col2           ║
╠═════════════════════╬═════════════════════════╣
║ 2014-03-13 10:16:00 ║ 2014-03-13 10:15:58.483 ║
║ 2014-03-12 10:16:00 ║ 2014-03-12 10:15:58.483 ║
║ 2014-03-11 10:16:00 ║ 2014-03-11 10:15:58.483 ║
╚═════════════════════╩═════════════════════════╝

答案 3 :(得分:0)

尝试此查询,

SELECT
    a12.Calendar_Year Calendar_Year,
    (sum(a11.mc_gross) - sum(a11.mc_fee)) WJXBFS1
FROM shine_orders a11
JOIN Calendar a12
    ON CONVERT(date, a11.dt) = CONVERT(date, a12.Calendar_Date)
GROUP BY a12.Calendar_Year

如果Calendar_Year听起来就像是一个日历年,那么你可以做到

SELECT
    Year(a11.dt) Calendar_Year,
    (sum(a11.mc_gross) - sum(a11.mc_fee)) WJXBFS1
FROM shine_orders a11
GROUP BY Year(a11.dt)