我有日期列Order_Date日期时间格式Isdat 14/05/2018 13:13:06这是格式),我需要在14:00之前提取今天的订单P:M'O'时钟和第二列我想在15:00之后提取订单P:M即时间从15:00 P:M到23:00 P:M在SQL SERVER中,
日期是24:00 Hor格式。
在输出Order_date应该是'yyyy-MM-dd hh:mm:ss'格式
答案 0 :(得分:0)
与其他人所说的一样,您需要做的第一件事就是修复您的数据;将日期存储为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之前提取今天的订单P:M'O'时钟和第二列我想在15:00之后提取订单P:M即时间从15:00 P:M到23:00 P:M在SQL SERVER中“。老实说,这是非感性的;在不同的列中根据时间放置不同的订单?我不知道你在这里是什么意思,我很害怕,而且我没有样本数据或预期结果可供使用。因此,相反,我将向您展示如何在特定日期14:00
之后但在'15:00之前退货:
SELECT *
FROM YourTable YT
WHERE OrderDate = '20170515'
AND OrderTime >= '14:00'
AND OrderTime < '15:00';
如果你需要更多细节,你会有很多评论要求你提供更多细节;我建议你看看那些。 :)