日期时间查询 SQL SERVER
Posted
技术标签:
【中文标题】日期时间查询 SQL SERVER【英文标题】:Date time query SQL SERVER 【发布时间】:2018-05-14 15:34:39 【问题描述】:我有日期列 Order_Date 日期时间格式 Isdat 14/05/2018 13:13:06 这是格式),我需要在 14:00 P:M 'O' Clock 之前提取今天的订单,在第二列中我想在 15:00 P:M 之后提取订单,即时间从 15:00 P:M 到 23:00 P:M 在 SQL SERVER 中,
日期采用 24:00 小时格式。
在输出Order_date应该是'yyyy-MM-dd hh:mm:ss'格式
【问题讨论】:
你的列是什么数据类型? 样本数据和期望的结果真的很有帮助。我不知道您是否要过滤行或添加新列或您想要做什么。我不确定“提取今天的订单”应该是什么意思。 日期类型没有格式。它们是二进制值。格式仅在解析文本或将日期值格式化为文本时应用。你实际上想做什么?您是否尝试将日期参数传递给查询?或者向最终用户显示结果?在这两种情况下,您不应该使用字符串 发布您使用的查询和实际的表定义。Order_Date
是什么?字符串字段(坏主意)? datetime
?还是您有单独的日期和时间字段?您不需要字符串转换,您需要使用适当的日期函数来过滤结果。例如,您可以只使用cast(order_date as time) between ...
,尽管这不会使用任何索引
日期时间没有格式,所以我们仍然不知道该列是什么数据类型。
【参考方案1】:
正如其他人所说,您需要做的第一件事是修复数据;将日期存储为varchar
是一个糟糕的设计选择。始终使用代表您数据的数据类型;将日期存储为date
,将数字存储为int
/decimal
,等等。
根据[文档],dd/MM/yyyy hh:mm:ss
没有样式代码,但是,下面的快速 SQL 告诉我样式代码 103 确实有效:
DECLARE @date varchar(50) = '31/05/2017 19:12:56';
WITH N AS (
SELECT 1 AS i
UNION ALL
SELECT i + 1
FROM N
WHERE I + 1 <= 150)
SELECT I, TRY_CONVERT(datetime2(0),@Date,I) AS Conversion
FROM N
OPTION (MAXRECURSION 150);
所以,首先,让我们修复您的数据。所以,让我们添加新列并删除旧列。
ALTER TABLE YourTable ADD OrderDate datetime2(0);
UPDATE YourTable
SET OrderDate = CONVERT(datetime2(0),YourDateColumn,103);
GO
ALTER TABLE YourTable DROP COLUMN YourDateColumn;
EXEC sp_rename 'dbo.YourTable.OrderDate','YourDateColumn','COLUMN';
好的,现在我们已经摆脱了您糟糕的数据类型,并获得了您的新专栏。很好。
现在,你想在这里专门查询时间;如果您这样做,理想情况下您希望将时间值和日期分开。使用 WHERE CONVERT(time, YourDateColumn) BETWEEN '14:00' AND '15:00'
之类的东西会使查询不可 SARGHable。因此,让我们为此使用几个计算列:
ALTER TABLE YourTable ADD OrderDate AS CONVERT(date, YourDateColumn);
ALTER TABLE YourTable ADD OrderTime AS CONVERT(time, YourDateColumn);
现在,对于您手头的问题:“我需要在下午 14:00 之前提取今天的订单,在第二列中,我想在下午 15:00 之后提取订单,即时间SQL SERVER 中从 15:00 P:M 到 23:00 P:M"。老实说,这是荒谬的;根据时间在不同的列中放置不同的订单?恐怕我不明白你在这里的意思,而且我没有样本数据或预期的结果可以使用。因此,我将向您展示如何在 14:00
之后但在特定日期的“15:00”之前退货:
SELECT *
FROM YourTable YT
WHERE OrderDate = '20170515'
AND OrderTime >= '14:00'
AND OrderTime < '15:00';
如果您需要更多详细信息,很多 cmets 要求您提供更多详细信息;我建议你看看那些。 :)
【讨论】:
非常感谢您的回答 Datetime 2 和 Tryconvert 是不可识别的内置函数名称 sql server 2014。 @Bilaldatetime 2
和 tryconvert
不是没有,因为两者都拼写不正确。这是datetime2
和TRY_CONVERT
。 datetime2
在 SQL Server 2008 中引入,TRY_CONVERT
在 2012 年引入。它们都在 SQL Server 2014 中。
@Bilal 供您参考:TRY_CONVERT
& datetime2
。在说明某个 SQL Server 版本中不存在某些内容之前,请进行一些尽职调查。 :)以上是关于日期时间查询 SQL SERVER的主要内容,如果未能解决你的问题,请参考以下文章
从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间
Sql Server函数日期时间函数日期查询今天昨天7天内30天的数据