在 SQL 查询中将日期舍入到当天
Posted
技术标签:
【中文标题】在 SQL 查询中将日期舍入到当天【英文标题】:Rounding dates to the day in an SQL query 【发布时间】:2014-03-16 18:52:50 【问题描述】:我被某事困住了。我正在尝试获取一长列日期,其格式也显示小时和分钟,并运行组查询以在日期级别粘贴值而不承认小时和分钟的差异。不幸的是,我不知道如何开始.到目前为止我放在一起的代码返回每个分组的日期和小时和分钟如下:
st_sql = "INSERT INTO [tblSearchEngine03] ([Date])" & _
"SELECT [tblSearchEngine02].[Date]" & _
"FROM [tblSearchEngine02]" & _
"GROUP BY [tblSearchEngine02].[Date]" & _
"ORDER BY [tblSearchEngine02].[Date]"
Application.DoCmd.RunSQL (st_sql)
我不确定截断表“tblSearchEngine02”上日期的最佳方法..
【问题讨论】:
【参考方案1】:首先关注SELECT
部分。您可以将 DateValue()
用于您的 Date
字段值。在 Access 查询设计器中将此作为新查询开始:
SELECT DateValue(se02.Date)
FROM tblSearchEngine02 AS se02
GROUP BY se02.Date
ORDER BY se02.Date
或者您可以使用DISTINCT
代替GROUP BY
:
SELECT DISTINCT DateValue(se02.Date)
FROM tblSearchEngine02 AS se02
ORDER BY se02.Date
在 SELECT
正常工作后,您可以将其转换为 INSERT
查询(Access 查询设计器将其称为“附加”查询)。
当您稍后在 VBA 代码中构建相同的语句时,请包含 Debug.Print st_sql
,以便您可以在“立即”窗口中查看已完成的语句文本并确保它符合您的预期。 (您可以使用 Ctrl+g 转到立即窗口。)
【讨论】:
汉斯,你说的 DateValue() 是什么意思?这是否意味着我需要去属性并改变一些东西?DateValue()
是 Access SQL 中支持的函数。有关详细信息,请参阅 Access 内置帮助系统中的帮助主题,或在网络上:DateValue Function 它会给你相当于@attila 建议的CDate(CInt([tblSearchEngine02].[Date]))
,但只需要一个函数即可。跨度>
对不起,汉斯,我希望我没有浪费你太多时间。我仍然不明白 DateValue 在 Access Query Designer 中的作用...
现在我不明白。试试这个:1.) 在查询设计器中创建一个新查询 2.) 切换到 SQL 视图 3.) 从我建议的查询之一中粘贴 SQL 文本 4.) 运行查询。它会给你想要的结果吗?
这不是我的建议。您是否只尝试过SELECT
部分(没有任何INSERT
)?这会返回正确的数据吗?【参考方案2】:
这样做的一种方法是将日期/时间格式化为日期字符串。如果您使用YYYY/MM/DD
,它将正确排序。否则,您可以将日期/时间转换为 int 以修剪时间,然后再转换回日期/时间类型。
以下是格式化为字符串的示例:
Format([tblSearchEngine02].[Date], "yyyy/mm/dd")
这是一个转换为日期的示例(最终结果将是日期/时间数据类型,因此它可能呈现为 03/16/2014 00:00
,具体取决于您的语言环境信息)
CDate(CInt([tblSearchEngine02].[Date]))
【讨论】:
谢谢阿提拉。我对编程有点陌生,所以请原谅我的无知.. 你说的是用 VBA 写东西对吗??? 您应该可以在查询中执行此操作。我可以用 SQL 更新我的答案来做到这一点。 Attila,您能否通过将日期/时间格式化为字符串来向我展示您的意思示例?? 试试这个:Format([tblSearchEngine02].[Date], "yyyy/mm/dd") INSERT INTO tblSearchEngine03 ([Date]) SELECT CDate(Format([tblSearchEngine02].[Date], "yyyy/mm/dd")) FROM tblSearchEngine02 GROUP BY Format([tblSearchEngine02].[Date] ], "yyyy/mm/dd")【参考方案3】:Access 将其日期存储为浮点数,其中整数部分是自 1900 年 1 月 1 日以来的天数,小数部分是一天中的小数部分(一天中的时间)。 Access 很乐意将这些日期视为数字而不进行任何转换,因此:
fix([tblSearchEngine02].[Date])
将修剪一天中的小数部分并将时间设置回午夜,并允许您按天分组。
【讨论】:
这比接受的答案要好得多,因为它也正确处理空值。以上是关于在 SQL 查询中将日期舍入到当天的主要内容,如果未能解决你的问题,请参考以下文章