我有一个查找表,其中一列包含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
我认为这可能会导致使用BI工具聚合到月份时出现问题,因此我想更新Calendar_Date列中的所有行(在查找表中),以截断所有行的毫秒数。有人可以就如何做到这一点提供指导吗?
两列的结构:
提前致谢!
答案 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)