我正在处理一个表,其中事件的日期和时间以 YYYMMDDHHmmSS 或“20120606122012”格式存储为字符。我需要将其与当前时间戳进行比较,以查看自事件发生以来是否已经超过 20 分钟,但这似乎比我预期的要困难。
是否可以这样做,或者如果不能:是否有不同的方法有效?
想要从一天中获取所有记录。所以2013-03-05 00:00:00.000和之间的一切2013-03-05 23:59:59.999。我们在后端与发生在2013-03-06 00:00:00.000.
因此,在测试中,我在 SSMS 中运行:
select cast('2013-03-05 23:59:59.999' as datetime)
select cast('2013-03-05 23:59:59.996' as datetime)
select cast('2013-03-05 23:59:59.994' as datetime)
Run Code Online (Sandbox Code Playgroud)
并得到:
2013-03-06 00:00:00.000
2013-03-05 23:59:59.997
2013-03-05 23:59:59.993
Run Code Online (Sandbox Code Playgroud)
毫秒部分会稍微回落。在第一行的情况下,它真的很重要。因为我不想要 2013-03-06 00:00:00.000 - 我想要午夜前一毫秒。
TSQL 在文档中声明它使用小数秒,而不是使用毫秒的 .Net 日期时间。这似乎只是语法上的差异,但如果您真的关心 TSQL 中的毫秒精度,您是否会被迫全面使用DateTime2。从datetime2to 转换datetime仍然会在几毫秒内把事情搞砸。
在 c# 中DateTime.Parse("03/5/2013 23:59:59.999").Millisecond仍然返回 999。
我这样解释好吗?如果我关心毫秒精度,我datetime2只坚持使用。
通常,这将是一个简单的修复,但在这种情况下,我们使用的是datetime作为参数接收的 Microsoft 系统函数。
我想计算从包含单个日期/时间字段的数据行工作所花费的时间。
给定日期的第一次出现可以被视为开始时间,下一次出现是结束时间,在任何给定日期来回交替。因此,如果我从上午 9:00 开始并在下午 12:00 吃午饭,在中午 12:30 吃完午饭返回,然后在下午 5:00 离开,我的数据将如下所示:
2013-03-07 09:00:00
2013-03-07 12:00:00
2013-03-07 12:30:00
2013-03-07 17:00:00
Run Code Online (Sandbox Code Playgroud)
这是另一个示例(在我的语言环境中,我们.用作日期分隔符):
22. 2. 2013 9:09:00
22. 2. 2013 13:28:09
25. 2. 2013 9:43:16
25. 2. 2013 15:15:19
25. 2. 2013 19:30:00
25. 2. 2013 21:30:00
26. 2. 2013 8:27:54
26. 2. 2013 16:31:51
27. 2. 2013 8:52:59
27. 2. 2013 15:08:35
28. 2. 2013 8:37:54
28. 2. 2013 16:37:08
28. 2. 2013 18:30:00
28. 2. 2013 20:30:00
Run Code Online (Sandbox Code Playgroud)
我想知道任何一天的工作总时间,并且还希望能够统计花费的时间,例如,任何给定的一周或一个月。
我正在记录一个事件表,并且想要一个输出(如本答案底部所示),问题是我正在获取行中的数据,但希望它们按列显示。
两个维度如下:
我想我必须按时间部分(例如按分钟或每小时)对日期时间值进行分组并检索每个服务器的事件列表,但我不知道如何编写查询?我需要一个by子句吗?
我已经写好了create语句,结构如下:
CREATE TABLE [dbo].[events](
[guidEventId] [uniqueidentifier] PRIMARY KEY,
[dtStart] [datetime2](7) NOT NULL,
[nDirection] [int] NOT NULL,
[nServerId] [int] NOT NULL
)
INSERT INTO events
([guidEventId],[dtStart],[nDirection],[nServerId])
VALUES
(newId(),'2013-08-01 00:01:00','0','1'),
(newId(),'2013-08-01 00:02:00','1','1'),
(newId(),'2013-08-01 00:03:00','0','1'),
(newId(),'2013-08-01 00:04:00','1','2'),
(newId(),'2013-08-02 00:01:00','0','1'),
(newId(),'2013-08-02 00:02:00','1','2'),
(newId(),'2013-08-02 00:03:00','0','2'),
(newId(),'2013-08-02 00:04:00','1','2');
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!6/25e74
茶几应该看起来像这样(白天):
DateTime | Server1 | Server2 | Sum |
--------------------------------------------
2013-08-01 | 3 | 1 | 4 |
2013-08-02 | 1 | 3 | 4 |
Run Code Online (Sandbox Code Playgroud) 我有一个包含datetime timestamp. 我正在寻找的是根据datetime timestamp.
这是我到目前为止所拥有的,尽管我认为它不正确:
SELECT jobs.*,occupations.title
FROM jobs
LEFT JOIN occupations on occupations.id = jobs.occupation_id
WHERE DATE_ADD(jobs.`date_created`,INTERVAL 27 DAY) = DATE(NOW())
Run Code Online (Sandbox Code Playgroud)
请帮忙 :)
我有一个查询,其中使用了以下内容
date_add(DATE_FORMAT(ss.week_startdate,'%y-%m-%d'),INTERVAL (tt.day_id- 1 )DAY) as date
Run Code Online (Sandbox Code Playgroud)
字段的数据类型是datetime,结果日期是这样的
2015-04-06
Run Code Online (Sandbox Code Playgroud)
但想要的结果是这样的
2015-04-6
Run Code Online (Sandbox Code Playgroud)
我不需要0在前一天。我试过这个
date_add(DATE_FORMAT(ss.week_startdate,'%y-%m-%e'),INTERVAL (tt.day_id- 1 )DAY) as date
Run Code Online (Sandbox Code Playgroud)
但没有用。任何人都可以请帮忙!
我正在尝试编写一个存储过程来确定两次之间的秒数差异。如果我要对我知道可以使用的值进行硬编码
CAST(datediff(second, [start], [end])/3600.0 As Decimal(18,4)))
Run Code Online (Sandbox Code Playgroud)
但我只需要在满足条件的情况下才能获得差异。我的想法是做这样的事情
Declare @diff decimal(18,4)
Create Table #Dope
(
date1 datetime
,inlate decimal(16,4)
)
INSERT INTO #Dope (date1) Values
('2016-01-04 08:08:47.000'),
('2016-01-04 08:25:59.000'),
('2016-01-04 08:27:47.000'),
('2016-01-04 08:00:00.000')
if CAST(date1 As Time) > '08:00:00.000'
--Here is where the capture would come but I am unsure of how to type it
SET @diff = CAST(datediff(second, [], [date1])/3600.0 As Decimal(18,4))
Run Code Online (Sandbox Code Playgroud)
如何将 Set 语句中的第一个日期时间设置为我需要秒差的当天上午 8 点?意思是,我不能只是将 '08:00:00.000' 硬编码到我的 Set 语句中,因为这两个日期我是不同的,这会给我跨越几天的秒数,这不是我所追求的。我只想看看 date1 和 '08:00:00.000' 之间的秒数差异
我有一个标题为reached_date的列。在我的查询中,该列的大部分值是2016-09-30 23:59:59.997。
然后我有一个 where 子句,内容如下:
WHERE achieved_date between '20160901' and '20160930'
Run Code Online (Sandbox Code Playgroud)
具有 2016-09-30 23:59:59.997 值的记录没有包含在我应该包含的结果中。我的意思是交易记录在 9 月 30 日。
如果这是一个奇怪的数据类型问题,有什么想法吗?
我们目前正在为我们的定制应用程序开发一个任务管理系统。经过深思熟虑,我们得出的结论是,我们只需要用户指定任务的截止日期。
我想知道当英国的用户添加任务并且圣彼得堡的用户看到它时它会如何工作,考虑到圣彼得堡比英国早至少 2 小时。
假设英国的用户创建了一个 20/Apr/2018 到期的任务。4 月 19 日 23:30(英国时间),圣彼得堡的一位用户打开了任务。但是,由于在圣彼得堡已经是 20/Apr,看起来任务已经完成,但实际上还没有安排运行。
如果日期字段实际上是 type date,我很确定圣彼得堡的用户会看到标记为过期的任务,因为他结束时已经是 20/Apr。
我见过其他几个任务工具,而且几乎所有工具都只允许任务的截止日期(而不是时间)。然而,我想知道其他系统如何处理此类问题,或者他们是否根本不打扰。
所以客观地回答我的问题:
datetime字段中捕获日期(即使我们不允许用户输入时间),然后还允许定义时区。我错过了什么吗?
编辑:为了回答有关我们是否希望任务的截止日期遵循查看任务的用户的时区或创建任务时的固定时区的问题,我们选择了固定时区。因此,任务将设置为英国时间 20/Apr 到期,只有在英国时间达到 YYYY-04-20 00:00:00.00 时才会到期。
为了支持这一点,我们将允许用户在创建任务时单击截止日期字段旁边的小图标,允许他们选择时区。时区将根据以下工作流程设置为默认值:
我们将为用户的帐户页面创建两个设置,允许用户:
a) 切换应用程序的选项以尝试从客户端自动获取其时区。
b) 让他们选择默认时区的选项。
基于这个要求,我们几乎可以得出结论,date数据类型是不可能的。现在对我来说不是 100% 清楚的是我们应该选择 a datetime2(我总是使用datetime2而不是datetime)还是 a datetimeoffset。
我有一个具有以下架构的表
table_name
id int
task_id int
completed_date datetime (INDEX IX_TBL_NAME_COMPLETED_DATE)
Run Code Online (Sandbox Code Playgroud)
我在这个查询上运行 EXPLAIN
EXPLAIN
SELECT
*
FROM table_name TBL
WHERE
TBL.completed_date BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)
此查询使用已完成日期的索引运行并获取记录
但是,在使用日期函数运行相同的查询时
EXPLAIN
SELECT
*
FROM table_name TBL
WHERE
CONVERT_TZ(TBL.completed_date, timezone1, timezone2) BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)
未使用索引导致查询变慢。
有人可以解释这种行为背后的原因以及优化此类查询的解决方案吗?
datetime ×10
sql-server ×6
date ×3
mysql ×3
t-sql ×3
datatypes ×1
date-format ×1
group-by ×1
index-tuning ×1
mysql-5.7 ×1
optimization ×1